##空类的成员
类的默认成员函数有六个,为 缺省构造函数、拷贝构造函数、赋值运算符重载、取地址运算符承载、const修饰的取地址运算符重载和析构函数;
class CEmpty{
public:
CEmpty(); //缺省构造函数
CEmpty(const CEmpty&); //拷贝构造函数
CEmpty& operator=(const CEmpty&); //赋值运算符重载
CEmpty* operator&(); //取地址运算符重载
const CEmpty* operator&(); //const修饰的取地址运算符重载
~CEmpty(); //析构函数
};
###其他注意事项
构造函数:当用explicit修饰构造函数时,为显示调用构造数,不能做隐式转换;
构造析构顺序:先调用基类的构造函数,后调用派生的构造函数;析构相反;
static:static的用法是将局部的成员变量/函数,变为全局的静态成员;静态成员不在数据具体的实例,static所修饰的成员函数,无this指针传入;
const:const修饰变量,当前修饰变量不可变;const修饰成员函数,隐式传入参数const this指针;
虚析构函数:当基类指针指向指向派生类对象时,基类析构函数被virtual修饰,调用delete时,会自动调用派生类的析构函数;
析构函数私有化:表示当前类的对象只能在堆上创建,不能在栈上创建;
##空类的大小
c++中空类和空结构体的所占大小为1;【c++中在空类和空结构体中增加一个虚设的字节】
no object shall have the same address in memory as any other variable
即c++中任何非空对象在内存中都不能拥有相同地址;为0,违反原则;
###注意事项
空基类最优化:当派生类单一集成空基类时,基类大小优化为0;
空基类中虚析构:基类生成虚函数表,基类中存在指向虚函数表的指针;大小为4;
空基类的多重继承:空基类最优化无法施加于空基类的多重继承;
空类继承空基类:无论空类继承过个空基类,还是空基类,派生的空类依旧为1;
虚基类继承:派生类继承虚基类时,派生类自身维护一个虚基类指针,指向虚基类表;【可以通过指令 cl -d1reportSingleClassLayout[classname] [filename].cpp 查看类的内存分布】
虚基类表和虚函数表:虚基类表存储的是虚基类相对直接继承类的偏移,而虚函数表存储的是虚函数地址