Default Constructor 的构造操作

本文探讨了编译器自动生成默认构造函数的条件,包括成员变量的构造需求、父类构造函数的存在、虚函数及虚基类的影响,并提供了通过Linux的objdump命令和Windows的IDA工具检查默认构造函数生成的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 查看
在这里插入图片描述

编译器何时为你生成默认构造函数?
  1. 包含带有默认构造函数的成员变量
  2. 父类有默认构造函数
  3. 有虚函数
  4. 有虚基类
原则

编译器需要时才会自动生成默认构造函数,注意不是程序需要,而是编译器需要。如给成员变量 int i 赋初值为0是程序需要,是程序员的职责,编译器一概不管。若成员变量有构造函数,则在构造期间,编译器会调用这些成员变量的构造函数初始化,此时该类若没有默认构造函数,则会自动创建一个。

误区
  1. 如果没有,编译器会自动创建默认构造函数 ×
  2. 编译器合成的默认构造函数会显式的设定每个成员变量的默认值 ×
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值