我需要知道编译器如何在cpp中使用析构函数

i need to know how compiler work with destructors in cpp

本文关键字:cpp 析构函数 编译器      更新时间:2023-10-16

假设我有两个不同的类。

为什么当我把类A对象作为数据成员放在类B中时,首先被销毁的类是类B,然后是类A,但当我把A对象放在类B的生成器中时,然后是A,然后是类别B?例如:

class A {
public:
~A() { std::cout << "Deleting An"; }
};
class B {
private:
A object;
public:
~B() { std::cout << "Deleting Bn"; }
};
int main( void ) {
B test;
return 0;
}

结果:

删除B
删除

但下一个例子给了我相反的结果:

class A {
public:
~A() { std::cout << "Deleting An"; }
};
class B {
public:
B() { A object; }
~B() { std::cout << "Deleting Bn"; }
};
int main( void ) {
B test;
return 0;
}

结果:

删除A
删除B

在第二个例子中,B test;调用B.的构造函数

构造函数B只是一个函数,它有一个局部变量A object;。这个对象被创建,并且在作用域的末尾(B的构造函数的末尾(它被取消作用域。

在main的末尾返回main,对象test被销毁。

因此,在这种情况下,对象A object;首先被破坏,随后对象B test;被破坏。

在你的第一个例子中,这是不同的。A object;是类B的成员,因此B的构造函数自动构造该成员。构造的顺序是:首先是基类(在您的示例中不存在(,然后是成员,然后是构造函数的主体。销毁的顺序相反:首先是销毁函数的主体,然后是成员(包括您的A object;(,然后是基类(在您的示例中不存在(。

正如在评论中所说,您可以轻松地在调试器中逐步执行代码,以更好地了解执行顺序。

因为类A的对象在类B的构造函数完成后立即销毁(因为它是函数中的局部变量(,并且它在调用类B析构函数之前。

在第二个例子中,您的构造函数中有对象(A类实例(,local。当您现在在主函数中实例化B时,构造函数会被调用,创建对象,并在构造函数完成后销毁它。在第一个示例中,对象是类成员,在主函数中的寿命与类对象的寿命一样长。当程序完成时,它会调用costumDestructor,然后首先执行,然后销毁所有成员(标准构造函数(。