C++基础知识整理(一)

本文主要整理了C++中的extern "C"用于混合语言编程的原理,静态成员函数不包含this指针的特点,__cdecl和__stdcall两种调用约定的区别,数组指针与指针数组的差异,以及指针和引用的本质区别。通过这些基础知识的学习,有助于深入理解C++的底层机制。

  基础知识搜集整理下,以后查看复习什么的方便一点。

  1.  extern "C"使用

        主要用于混合语言编程。比如说C语言调用C++开发的DLL,由于C++语言编译后的 函数符号表是带参数类型的,而C语言编译后函数符号表是不带参数类型的。所以要想在C语言中调用C++的DLL,DLL中导出的函数必须加上extern "C".

        例:void foo(int, int )函数

        C++编译后,生成 _foo_int_int 之类的符号

        C语言编译后,生成_foo之类的符号,不带参数类型,所以C语言不支持函数重载

        有关于extern "C"的具体介绍,百度百科讲的比较详细,这里列一个链接 http://baike.baidu.com/view/2816461.htm?fromId=2814224

     2.     静态成员函数不能调用成员变量,因为不含this指针。

     3.    __cdecl 和 __stdcall

        __cdecl 是C语言函数调用约定,__stdcall 是C++函数调用约定。参数都是从右到左依次入栈,__stdcall需要在编译时就确定参数个数,因为使用该约定的函数是函数自己清栈,清栈的时候要知道参数个数。__cdecl约定的函数由调用者清栈,所以函数参数个数在编译期可以不确定,可以出现类似 int add(int a, int b, ...) 形式的函数。

     4.   数组指针和指针数组

        数组指针是一个指针,指针数组是一个数组。

        例:int a[2][2] = {{1,2}, {3,4}};

               int (*p)[2] = a;     //数组指针,只定义了一个指针p。 (*p)[0]  等价于 a[0][0], (*p)[1] 等价于 a[0][1]

               int *pp[2] ; //指针数组,[]的优先级比*的优先级高,所以先结合成p[],定义了一个指针数组,pp[0]和pp[1].

     5.   指针和引用区别

        引用是定义时就要初始化,初始化之后就不可再更改,而指针初始化之后可以更改。

        例:   int a = 5; int b = 6;

                  int &c = a;       //c是a的引用,以后c一直是a的引用,不会更改,可以理解为  int * const pp, 这个 (*pp)就等价于c;

                  int *p;              //指针可以先不初始化,只是声明

                  p = &b;           //OK,指针初始化之后还可以指向其他地址

                  c = b;              //此时c还是a的引用,只是把b的值赋给了c;该语句后,a 等于 6

<think> 我们正在整理C++知识点的内容。由于C++知识点非常广泛,我们需要涵盖基础语法、面向对象、模板、STL、新标准特性等多个方面。下面将按照类别进行组织,每个类别下给出关键点。 注意:由于篇幅限制,我们不可能详尽所有细节,但会尽量覆盖重要知识点。 、基础语法 1. 数据类型:基本数据类型(int, float, double, char, bool等)、类型修饰符(signed, unsigned, short, long)、类型转换(static_cast, dynamic_cast, const_cast, reinterpret_cast)、自动类型推导(auto)。 2. 变量与常量:变量定义、作用域(局部、全局、静态)、常量(const, constexpr)、宏定义(#define)。 3. 运算符:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符(三目运算符)、逗号运算符、sizeof运算符。 4. 控制结构:条件语句(if, switch)、循环语句(for, while, do-while)、跳转语句(break, continue, goto, return)。 5. 函数:函数定义、参数传递(值传递、引用传递、指针传递)、默认参数、函数重载、内联函数(inline)、函数指针、lambda表达式。 6. 数组与字符串:维数组、多维数组、字符数组、C风格字符串、字符串字面量、原始字符串字面量(C++11)。 7. 指针与引用:指针定义与使用、指针运算、指针与数组、指针与函数、引用(左值引用、右值引用(C++11))、空指针(nullptr, C++11)。 8. 内存管理:动态内存分配(new, delete)、智能指针(unique_ptr, shared_ptr, weak_ptr, C++11)、内存泄漏。 二、面向对象编程 1. 类与对象:类定义、对象创建、访问控制(public, private, protected)、构造函数(默认构造、拷贝构造、移动构造(C++11))、析构函数、成员初始化列表。 2. this指针:指向当前对象的指针。 3. 静态成员:静态数据成员、静态成员函数。 4. 友元:友元函数、友元类。 5. 继承:单继承、多继承、访问控制(public, protected, private继承)、菱形继承与虚继承。 6. 多态:虚函数、覆盖(override)、纯虚函数与抽象类、虚函数表(vtable)、动态绑定。 7. 运算符重载:成员函数重载、友元函数重载、常用运算符重载(如+、-、<<、>>等)。 8. 类型转换:自定义类型转换(转换构造函数、类型转换运算符)。 三、模板 1. 函数模板:定义、实例化、模板参数推导、显式指定模板参数。 2. 类模板:定义、实例化、模板特化(全特化、偏特化)。 3. 可变参数模板(C++11):参数包、包展开、折叠表达式(C++17)。 4. 模板元编程:编译期计算、类型萃取(type traits)、SFINAE。 四、标准模板库(STL) 1. 容器:序列容器(vector, deque, list, forward_list, array)、关联容器(set, map, multiset, multimap)、无序容器(unordered_set, unordered_map等,C++11)、容器适配器(stack, queue, priority_queue)。 2. 迭代器:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器、迭代器适配器(reverse_iterator, insert_iterator等)。 3. 算法:非修改序列操作(for_each, find, count等)、修改序列操作(copy, transform, replace, fill, remove等)、排序及相关操作(sort, partial_sort, binary_search等)、数值算法(accumulate, inner_product等)。 4. 函数对象:谓词(predicate)、内建函数对象(如plus, less等)、函数适配器(bind, mem_fn, C++11)。 5. 字符串:std::string,基本操作(构造、赋值、连接、比较、查找、子串等)。 五、异常处理 1. 异常机制:try块、catch块、throw表达式。 2. 异常安全:RAII(资源获取即初始化)、异常规范(已弃用)、noexcept(C++11)。 3. 标准异常:std::exception及其派生类(logic_error, runtime_error等)。 六、新标准特性(C++11/14/17/20) 1. C++11:auto、范围for循环、初始化列表、右值引用与移动语义、lambda表达式、智能指针、constexpr、nullptr、类型推导(decltype)、变长模板、override与final、强类型枚举(enum class)、线程库(std::thread, mutex, condition_variable等)、正则表达式库、随机数库等。 2. C++14:泛型lambda、lambda捕获表达式、函数返回类型推导、二进制字面量、数字分位符、变量模板等。 3. C++17:结构化绑定、if constexpr、内联变量、折叠表达式、类模板参数推导、std::optional、std::variant、std::any、文件系统库、并行算法等。 4. C++20:概念(concepts)、模块(modules)、协程(coroutines)、范围(ranges)、三向比较(spaceship operator)、日历和时区库等。 七、其他 1. 文件操作:<fstream>(ifstream, ofstream, fstream)。 2. 多线程:线程管理、互斥量、条件变量、原子操作(atomic)、异步操作(async, future, promise)、线程本地存储(thread_local)。 3. 预处理器:宏(#define, #include, #ifdef, #ifndef, #endif等)。 4. 编译与链接:编译过程(预处理、编译、汇编、链接)、静态库与动态库。 由于C++知识点非常庞大,以上只是个大纲。下面我们给出个简单的示例代码,展示类的基本使用和智能指针。 示例代码:个简单的类和使用智能指针 ```cpp #include <iostream> #include <memory> // for smart pointers class MyClass { public: MyClass(int value) : data(value) { std::cout << "Constructor called with value: " << value << std::endl; } ~MyClass() { std::cout << "Destructor called for value: " << data << std::endl; } void print() const { std::cout << "Value: " << data << std::endl; } private: int data; }; int main() { // 使用智能指针管理对象 std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(10); ptr1->print(); // 移动语义:转移所有权 std::unique_ptr<MyClass> ptr2 = std::move(ptr1); if (ptr1) { ptr1->print(); // ptr1现在为空,不会执行 } if (ptr2) { ptr2->print(); // 输出: Value: 10 } return 0; } ``` 解释:这个示例展示了如何定义个类,以及如何使用智能指针(unique_ptr)来管理动态分配的对象。unique_ptr是种独占所有权的智能指针,当它离开作用域时,会自动释放所指向的对象。通过移动语义,我们可以将所有权从个unique_ptr转移给另个。 §§相关问题§§: 1. C++中的构造函数有哪几种?它们各自的作用是什么? 2. 请解释C++中的多态性,并给出个示例。 3. 什么是模板特化?请举例说明。 4. C++11中的lambda表达式由哪些部分组成?请给出个例子。 </think> 下面是C++核心知识点的系统整理,涵盖基础语法到高级特性,并附带示例代码: ### 、基础语法 1. **数据类型与变量** ```cpp int i = 10; // 整型 double d = 3.14; // 浮点型 char c = 'A'; // 字符型 bool flag = true; // 布尔型 auto x = 5.0f; // 自动类型推导 (C++11) ``` 2. **常量与指针** ```cpp const int MAX = 100; // 常量 int* ptr = &i; // 指针 int& ref = i; // 引用 ``` 3. **控制结构** ```cpp // 范围for循环 (C++11) int arr[] = {1,2,3}; for(int n : arr) { cout << n << " "; } // 类型安全的nullptr (C++11) int* p = nullptr; ``` --- ### 二、面向对象编程 1. **类与对象** ```cpp class Person { public: // 构造函数 Person(string n) : name(n) {} // 虚函数 (多态基础) virtual void speak() { cout << "I'm " << name; } private: string name; }; class Student : public Person { public: // override关键字 (C++11) void speak() override { cout << "I'm a student"; } }; ``` 2. **特殊成员函数** ```cpp class Resource { public: Resource() {} // 默认构造 Resource(const Resource&); // 拷贝构造 Resource(Resource&&) noexcept; // 移动构造 (C++11) ~Resource(); // 析构函数 }; ``` --- ### 三、内存管理 1. **智能指针 (C++11)** ```cpp #include <memory> unique_ptr<int> uPtr = make_unique<int>(10); // 独占所有权 shared_ptr<int> sPtr = make_shared<int>(20); // 共享所有权 weak_ptr<int> wPtr = sPtr; // 弱引用 ``` 2. **移动语义** ```cpp vector<string> createVector() { vector<string> tmp{"a", "b", "c"}; return tmp; // 触发移动构造而非拷贝 } ``` --- ### 四、模板编程 1. **函数模板** ```cpp template <typename T> T max(T a, T b) { return (a > b) ? a : b; } ``` 2. **类模板与特化** ```cpp template <typename T> class Box { T content; }; // 特化版本 template <> class Box<string> { string content; void specialHandle(); }; ``` --- ### 五、标准库组件 1. **容器操作** ```cpp vector<int> vec = {1,2,3}; vec.emplace_back(4); // 原位构造 (C++11) unordered_map<string, int> map; map["age"] = 25; // 哈希表 ``` 2. **Lambda表达式 (C++11)** ```cpp auto sum = [](int a, int b) -> int { return a + b; }; sort(vec.begin(), vec.end(), [](int a, int b){ return a > b; }); ``` --- ### 六、现代C++特性 1. **右值引用** ```cpp void process(string&& str) { // str为临时对象的资源 } ``` 2. **并发支持 (C++11)** ```cpp #include <thread> void task() { cout << "Thread running"; } thread t(task); // 启动线程 t.join(); ``` 3. **概念约束 (C++20)** ```cpp template <typename T> concept Addable = requires(T a, T b) { { a + b } -> convertible_to<T>; }; template <Addable T> T add(T a, T b) { return a + b; } ``` --- ### 七、最佳实践 1. **RAII原则** ```cpp class FileHandle { public: FileHandle(string path) : f(fopen(path.c_str())) {} ~FileHandle() { if(f) fclose(f); } private: FILE* f; }; ``` 2. **异常安全** ```cpp try { throw runtime_error("Oops"); } catch (const exception& e) { cerr << "Error: " << e.what(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值