Ch01-C++ 之 基础
April 20, 2022
1.数据类型 #
| 基本类型 | 所占大小 (bit) | 最小范围 | 最大范围 |
|---|---|---|---|
| void | 0 | ||
| bool | 8 | ||
| char | 8 | -128 | 127 |
| unsigned char | 8 | 0 | 255 |
| short (signed short) | 16 | -32768 | 32767 |
| unsigned short | 16 | 0 | 65535 |
| int (signed int) | 32 | -2147483648 | 2147483647 |
| unsigned (unsigned int) | 32 | 0 | 4294967295 |
| long (signed long) | 32 | -2147483648 | 2147483647 |
| unsigned long | 32 | 0 | 4294967295 |
| float | 32 | -3.4×10^38 | 3.4*10^38 |
| double | 64 | -1.7×10^308 | 1.7×10^308 |
| long double | 64 | -1.7×10^308 | 1.7×10^308 |
| long long | 64 | -9223372036854775808 | 9223372036854775807 |
2. 访问权限修饰符 #
| 修饰符 | 同一个类 | 子类 | 任何地方 |
|---|---|---|---|
| public | yes | yes | yes |
| protected | yes | yes | |
| private | yes |
3. 特殊函数生成规则 #
| 用户声明\编译器生成 | 析构函数 | 默认构造函数 | 拷贝构造函数 | 拷贝赋值函数 | 移动构造函数 | 移动赋值函数 |
|---|---|---|---|---|---|---|
| 析构函数 | N | Y | Y | Y | N | N |
| 默认构造函数 | Y | N | Y | Y | Y | Y |
| 拷贝构造函数 | Y | Y | N | Y | N | N |
| 拷贝赋值函数 | Y | Y | Y | N | N | N |
| 移动构造函数 | Y | Y | N | N | N | N |
| 移动赋值函数 | Y | Y | N | N | N | N |
注意
- 用户定义了移动构造函数那么编译器就不会生成移动赋值函数了。但是拷贝构造函数却与之不同,它依然会生成拷贝赋值函数,这主要是为了兼容旧的 C++ 版本。
- 用户定义了析构函数那么编译器不会生成移动构造函数和移动赋值函数,但是会生成拷贝构造函数和拷贝赋值函数,这同样是为了兼容旧的 C++ 版本。
- 成员函数模板不抑制特殊成员函数的生成。
4. RTTI #
RTTI(Runtime Type Identification) 即“运行时类型识别”。C++ 通过以下关键字 typeid 和 dynamic_cast 提供 RTTI 功能。
5. RAII #
RAII(Resource Acquisition is Initialization),直译过来是“资源获取即初始化”,也就是说在构造函数中申请分配资源,在析构函数中释放资源。
智能指针(std::shared_ptr 和 std::unique_ptr)是 RAII 最具代表的实现,使用智能指针,可以实现自动的内存管理,再也不需要担心忘记 delete 造成的内存泄漏。