C++ 构造函数和析构函数的继承

本文探讨了C++中子类构造函数如何正确调用父类构造函数的方法,特别是当子类构造函数带有参数时的情况。此外,还讨论了析构函数的调用顺序,即子类析构函数应先于父类析构函数被调用。

C++中子类必须调用父类的构造函数和析构函数

子类带参数的构造函数如果不明确调用父类相应带参数的构造函数,则会调用父类没有参数的构造函数,这是C++内存分配特性决定的

 B(int i):A(i)
 {
  printf("B() i");
 }

 

析构时子类必须先调用自身的析构函数然后调用父类的析构函数

C++中,构造函数析构函数的执行顺序受到多种因素的影响,包括类继承、对象生命周期管理以及静态对象与全局对象的存在。以下是关于构造函数析构函数执行顺序的详细说明: ### 构造函数的执行顺序 1. **基类构造函数**:当一个派生类的对象被创建时,首先调用其基类的构造函数。如果存在多个基类,则按照继承列表中的顺序从左到右依次调用每个基类的构造函数。 2. **成员对象构造函数**:在所有基类构造函数执行完毕后,接下来会执行派生类内部定义的成员对象的构造函数。这些成员对象的构造顺序与其在类定义中的声明顺序一致。 3. **派生类构造函数**:最后,执行派生类自身的构造函数体。 例如,对于如下代码: ```cpp class B {}; class C {}; class A : public B, public C { public: A(); ~A(); }; ``` 创建`A`类的对象时,构造函数的执行顺序为:`B` -> `C` -> `A` [^3]。 ### 析构函数的执行顺序 1. **派生类析构函数**:当对象生命周期结束时(如函数返回或程序退出),首先执行派生类的析构函数。 2. **成员对象析构函数**:接着,按照成员对象在类定义中的声明顺序的逆序执行它们的析构函数。 3. **基类析构函数**:最后,按照基类继承列表的逆序执行每个基类的析构函数。 继续使用上面的例子,销毁`A`类的对象时,析构函数的执行顺序为:`A` -> `C` -> `B` [^3]。 ### 局部变量自动对象 - 对于局部变量自动对象,在进入包含它们的作用域时构造,并且在离开该作用域时按构造的逆序进行析构。例如,在`main()`函数中定义的局部对象会在`main()`结束时被析构 [^2]。 ### 静态对象全局对象 - **静态对象**:静态对象仅在第一次到达其声明点时构造一次,并且在程序终止时按照与构造相反的顺序析构 [^2]。 - **全局对象**:全局对象在程序启动时构造,并且在程序终止时按照与构造相反的顺序析构 [^5]。 ### 示例代码分析 考虑以下示例代码片段: ```cpp Time g_a = {8,0,0}; // 全局对象 Time g_b = {9,0,0}; // 全局对象 static Time g_c = {10,10,10}; // 静态全局对象 static Time g_d = {11,11,11}; // 静态全局对象 int main() { cout << "进入main()" << endl; // ...其他操作... cout << "退出main()" << endl; return 0; } ``` 在这个例子中,全局对象`g_a``g_b`以及静态全局对象`g_c``g_d`将在`main()`函数开始之前构造。而在`main()`函数结束后,这些对象将按照构造顺序的逆序被析构 [^5]。 通过理解这些规则,可以更好地管理优化资源分配,确保程序正确运行并避免内存泄漏或其他相关问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值