特征: 书名 <C++ Primer第四版> 总页数1037, 文字版, 排版较稀疏
显示构造函数(不允许转换)explicit
对象函数,重载()操作符
删除数组用 delete[]
复制构造(编译器总是自动合成)
赋值操作符(编译器总是自动合成甚至是派生类也会生成一个对应的),删除左操作数对象,返回引用
?赋值操作符为何返回引用
虚的赋值操作符不会影响编译器生成派生类自己的赋值操作
操作符重载
类可以定义转换为其他类型的,转换函数,无返回类型,无参数
继承权限不影响当前派生类访问上一级基类
友元不会继承
static成员不会生成多个副本
派生类赋值(或初始化)给基类, 构建出来的对象派生的部分被丢弃
容器使用赋值保存对象,派生类对象被保存在基类容器中,派生的部分会被切去
相反的也不能把基类放入派生类容器
非public继承的派生类不能转换到基类
派生类需要显示调用基类的构造函数,否则隐含调用默认构造函数
派生类初始化列表中可以指出要调用的基类构造函数
派生类重写基类的虚函数,参数相同,返回类型可以是基类返回类型的派生类(很绕是吧)
析构函数只负责清理所属类(继承的也是),编译器自动调用
指向派生类的父类指针被delete时不会调用子类的析构函数,除非析构函数为虚拟的
继承不能改变函数的虚拟特性
在构造/析构函数中,虚函数的版本为当前类对象(而非动态绑定)
派生类中的函数定义会屏蔽基类中的所有同名函数,用using或显示声明来显现这些屏蔽的函数成员
句柄类,使用值对象实现指针语法,并管理引用计数
指针无法被追踪,但是赋值操作由编译器确定并自动调用构造/析构函数
虚函数的动态绑定只能应用于 引用/指针 指向的对象
模板参数关键字 class/typename 没有区别
函数模板可是 inline
声明所有模板的实例为友元,或特定的实例为友元
使用typename 声明一个成员是类内部声明的数据类型 typename CLASS::TYPE value;
模板参数可以是非类型的
模板优先生成新的实例,而非类型转换(const 有例外,很烦忽略吧)
模板函数中非模板类型的函数参数可以应用类型转换(绕死你)
给函数指针用一个模板函数名赋值,会反向实例化一个该模板对应的函数,规则由函数指针的声明确定
函数的返回类型无法用于模板函数的参数类型推断,必须在调用模板时显示声明
模板类型推断可以自动判断出右边的类型,则调用模板函数时的显示声明可以 全部/部分 省略
*定义函数模板时使用export
模板类中的模板成员, 奇葩的定义格式:
template<class ClassType> template<class MethodType> void class<ClassType>::method(MethodType mt) {}
模板类的每一个实例都有自己的static成员, 该成员用实例化声明访问
模板特化: 手动定义一个模板的实例
模板类中的成员可以单独特化
模板类的部分特化, 部分特化优先于普通模板
模板函数与普通函数重载, 则普通函数优先调用
抛出异常时, 参数使用赋值操作(小心对象被切割), catch 的匹配更严格不支持类类型转换
抛出指针后, 要立即念圣经
在块内new对象, 一旦抛出异常, 该内存可能成为野内存
析构函数中抛出异常会执行terminate
使用 throw; 在catch中重新抛出异常, 异常对象是原始对象而非catch形参
要想改变异常对象, catch使用引用
catch(...) 抓住所有异常
构造函数初始化列表也可以try写法是: CLASS::CLASS() try:init() { /* function body */ } catch(...) { }
资源分配即初始化 RAII, 编译器总是能保证在块退出或异常时调用局部对象的析构函数
使用资源管理类, 可以免去catch异常然后检测并释放已经分配的内存
声明函数可能抛出的异常, 函数指针也可以声明抛出的异常
派生类异常列表不能比基类多
命名空间好难看, 坚决不用命名空间!!! (update: 尽可能使用命名空间)
多继承, 基类构造顺由派生列表决定, 析构函数相反
两个类共同继承自一个基类A, 另一个类继承这两个类, 则会有两个该基类A的副本
两个类CD使用虚继承自A类, 则继承这两个类的派生类E只有一个A类的实例, 并且必须在派生类E中初始化A类的构造函数, 而CD对A的初始化被忽略
所有的虚基类构造函数总是先被调用, 然后是所有的普通基类构造函数
分配内存不执行构造, 手动执行构造/析构函数
RTTI 动态类型, typeid()--<type_info>, dynamic_case
类成员的指针
嵌套类
模板内的嵌套类也是模板
union 不能具有静态和引用成员, 不能定义有构造/析构/赋值操作函数的类类型成员
可以在函数体内定义类, 这种类的定义有严格限制
使用 extern "C" 声明该函数(或函数指针)是C语言规则的
c++ 编译器实现好复杂...
CatfoOD 2016 v0.41