1. 静态成员变量不计算在对象的sizeof内;
2. 普通成员函数和静态成员函数不计算在sizeof内;
3. 虚函数不计算在对象的sizeof内,但虚函数会让对象的sizeof增加4字节以容纳指向虚函数表的指针;
4. 虚函数表是基于类的(跟着类走,不是基于对象的);
5. 如果类中有多个数据成员(成员变量),那么为了访问速度和性能考虑,某些编译器可能会将数据成员之间的内存占用比例进行调整;
编译器生成 "合成默认构造函数"的第一种情况:
1. 如果该类没有任何构造函数;
2. 但包括一个类类型的成员变量,且这个成员变量所属的类有一个默认构造函数;
编译器生成 "合成默认构造函数"的第二种情况:
1. 父类带有默认构造函数;
2. 子类没有任何构造函数;
编译器生成 "合成默认构造函数"的第三种情况:
1. 一个类含有虚函数;
2. 该类没有任何构造函数;
编译器生成 "合成默认构造函数"的第四种情况:
1. 一个类带有虚基类;
编译器生成 "合成默认构造函数"的第五种情况:
1. 在定义成员变量的时候赋初值;
编译器生成"拷贝构造函数"的第一种情况:
1. 如果一个类A没有拷贝构造函数;
2. 但该类还有一个类类型的成员变量,且成员变量的类类型内含有拷贝构造函数;
编译器生成"拷贝构造函数"的第二种情况:
1. 如果一个类没有拷贝构造函数,但是它有一个父类;
2. 父类有拷贝构造函数;
编译器生成"拷贝构造函数"的第三种情况:
1. 如果一个类没有拷贝构造函数;
2. 但是该类定义了虚函数或者该类的父类定义了虚函数;
编译器生成"拷贝构造函数"的第四种情况:
1. 如果一个类没有拷贝构造函数;
2. 但是该类有虚基类;
下列场合下必须要用初始化列表来初始化成员:
1. 如果成员变量是引用类型;
2. 如果成员变量是const类型;
3. 如果该类继承自一个基类,并且基类中有构造函数,这个构造函数里还有参数;
4. 如果类中成员变量的类型是某个类类型,而这个类类型所指类的构造函数带有参数;
1. 包含虚函数的类才会有虚函数表,同属于一个类的对象共享这个虚函数表,但是每个对象都有各自的虚函数表指针,当然该指针所指向的地址(虚函数表首地址)相同;
2. 父类中有虚函数就等于子类中有虚函数。换句话说,父类中有虚函数表,则子类中肯定也会有虚函数表,即便不覆盖父类的任何虚函数;
3. 如果子类中完全没有新的虚函数,则可以认为子类的虚函数表和父类的虚函数表内容相同,但仅仅是内容相同,这两个表在内存中是处于不同位置的。换句话说,这是内容相同的两张表;
4. 超出虚函数表不放呢的内存内容不可知也不可预测。最好的办法就是不要触碰其中的内容;
不要在子类中重新定义虚函数缺省参数的值;