C++ 保证在处理类时处理类成员

C++ 保证在处理类时处理类成员,c++,destructor,composition,C++,Destructor,Composition,我有以下情况: 我的类A包含类B中的堆栈成员对象: Class A{ B b; } 我使用B对象来重新定义A的初始化和销毁行为 Class B{ B(){cout<<"taken care of some specific context initialization"<<endl;} ~B(){cout<<"cleaning the context initialization done before"<<endl;}

我有以下情况:

我的类A包含类B中的堆栈成员对象:

Class A{
    B b;
}
我使用B对象来重新定义A的初始化和销毁行为

Class B{
    B(){cout<<"taken care of some specific context initialization"<<endl;}
    ~B(){cout<<"cleaning the context initialization done before"<<endl;}
}
B类{

B(){coutC++遵循一种“好像”行为,这意味着理论上只要程序的行为不受影响,在之前
B
就有可能被销毁。如果它不受影响,那么在什么时候被销毁其实并不重要

但实际上,
b
将在其所有者
A
实例的析构函数被销毁后立即销毁

其保证如下:

12.4析构函数[类dtor] 8) 执行析构函数体并销毁任何 在主体内分配的自动对象,类X的析构函数 调用X的直接非变量非静态数据的析构函数 成员,X的直接基类的析构函数,如果X是 最派生类(12.6.2)的类型,其析构函数调用 X的虚拟基类的析构函数。[…](强调我的)


请注意,其可观察的行为就好像发生了这种情况一样的实现仍然符合标准。在您的特定情况下,由于析构函数具有IO操作,因此可以保证这种行为确实发生。

b
不会在“A”之后被销毁。它在
A
的销毁过程中被销毁。编译器无法决定在销毁之前或之后销毁它。编译器无法这样做,因为析构函数有副作用。