C++会默默编写并调用哪些类成员函数?

Answer:ctor、dtor(不是virtual的,除非这个class继承了一个声明了virtual-dtor的基类)、copy ctor、copy assignment operator、move ctor(C++11)、move assignment operator(C++11)、dereference operator、const dereference operator(这两个有的版本有,有的版本没有,自己心里先知道)


对一个空类求sizeof的结果是0吗?不是的话应该是多少?如果可以加入类成员函数的话,又应该是多少?如果加入的成员函数含有虚函数呢?

Answer:空类sizeof的结果应该是1;如果是普通类成员函数,则还是1;如果有虚函数,则应该是该运行环境下对指针求sizeof的结果。

解析:每个实例在内存中都有一个独一无二的地址。为了达到这个目的,编译器往往会给一个空类隐含地加一个字节,这样空类在实例化后在内存也能得到独一无二的地址。


如果一个class内含reference成员,则编译器会拒绝为class生成copy assignment operator(理由是引用的一次绑定不可更改的特性)


什么时候编译器会生成默认ctor:

  • 该类有一个组合方式包含的类成员B,B定义了默认构造函数(空函数体里其实有要调用B构造函数的内容)
  • 该类继承了一个基类,基类有默认构造函数(同上,和C++类继承的构造顺序有关)
  • 该类定义了虚函数(生成的构造函数要为对象初始化vptr)
  • 该类虚继承自其他类(初始化虚基类表,这个机制还不熟悉)

为什么对一个正常类对象实例求sizeof,得到的结果一般是大于等于类中所有非静态成员求sizeof的值之和?

Answer:等于大小的情况没啥讨论的,类实例得至少装下类声明中声明的非静态类成员实例。对大于的情况,可能有如下可能:

  • 内存对齐所填入的padding
  • vptr、RTTI支持信息等,和C++对象模型有关

给出以下代码:

#include<iostream.h>

class a {};
class b {};
class c: public a {
    virtual void fun() = 0;
};
class d: public b, public c {};
int main() {
    cout << "sizeof(a)" << sizeof(a) << endl;
    cout << "sizeof(b)" << sizeof(b) << endl;
    cout << "sizeof(c)" << sizeof(c) << endl;
    cout << "sizeof(d)" << sizeof(d) << endl;
    return 0;
}


求运行结果。

Answer:执行结果应该分别是1、1、4、8。

解析:a、b是属于空类,分1字节去唯一确定对象实例的情况。c是因为有虚函数,保存vptr。d是因为4+1=5,之后因为padding的缘故,加上3字节的padding,得到8的结果。