C++中构造函数和析构函数的调用顺序
情况一:类B继承类A
结论一:定义变量时:先调用父类的构造函数,再调用派生类的构造函数;变量销毁时:先调用派生类的析构函数,再调用父类的析构函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <iostream> using namespace std; class A { public : A() { cout<< "AAAAAAAAAAAA" <<endl; } ~A() { cout << "~AAAAAAAAAAAA" << endl; } }; class B: public A { public : B() { cout<< "BBBBBBBBB" <<endl; } ~B() { cout << "~BBBBBBBBB" << endl; } }; void solution() //当函数开始时,调用构造函数,当函数结束时,变量对象被销毁 { B b1; } int main() { solution(); return 0; } |
情况二:在类B中使用类A类型的变量作为成员变量
结论二:定义变量时:先调用A中的构造函数,再调用B中构造函数;变量销毁时:先调用B的析构函数,再调用A的析构函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <iostream> using namespace std; class A { public : A( int _a) { a = _a; cout << "A构造函数" << endl; cout << a << endl; } ~A() { cout << "A析构函数" << endl; } protected : private : int a; }; class B { public : B( int _b1, int _b2): a1(1), a2(2) { cout << "B的构造函数" << endl; } B( int _b1, int _b2, int m, int n): a1(m), a2(n) { cout << "B的构造函数" << endl; b1 = _b1; b2 = _b2; } ~B() { cout << "B析构函数" << endl; } protected : private : int b1; int b2; A a1; A a2; //a的构造函数的顺序和上述的调用初始化列表顺序无关,和声明的顺序有关系 }; void display() { B b(1, 2, 3, 4); } int main() { display(); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)