login
迎访问QkqBeer博客园!欢

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;
}

  

posted @   BeerQkq  阅读(547)  评论(0编辑  收藏  举报
编辑推荐:
· 基于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)
点击右上角即可分享
微信分享提示