Default Constructor 的构造操作
如何查看编译是否生成了默认构造函数?
- Linux 使用 objdump 命令,如 objdump a.o -S 可以查看 a.o 的函数
- Windows 使用 IDA 工具查看
示例:
class A { public: A(){} };
class B { public: A a; };
int main() {
B b;
return 0;
}
使用gcc编译:(关闭编译优化)
gcc -c -O0 a.cpp -o a.o
使用objdump查看:
objdump -t a.o
发现有函数符号 _ZN1AC2Ev,使用 c++filt 方便查看,发现就是A的默认构造函数
0000000000000000 .text._ZN1AC2Ev
# c++filt _ZN1AC2Ev
A::A()
使用 IDA 查看
编译器何时为你生成默认构造函数?
- 包含带有默认构造函数的成员变量
- 父类有默认构造函数
- 有虚函数
- 有虚基类
原则
编译器需要时才会自动生成默认构造函数,注意不是程序需要,而是编译器需要。如给成员变量 int i 赋初值为0是程序需要,是程序员的职责,编译器一概不管。若成员变量有构造函数,则在构造期间,编译器会调用这些成员变量的构造函数初始化,此时该类若没有默认构造函数,则会自动创建一个。
误区
- 如果没有,编译器会自动创建默认构造函数 ×
- 编译器合成的默认构造函数会显式的设定每个成员变量的默认值 ×