如果我有类似
的话class Foo { ... }
class UsesFoo {
private:
Foo foo;
public:
UsesFoo() : foo(1, 2, 3) { }
}
然后根据我的理解,当我构建UsesFoo
(是UsesFoo *myMan = new UsesFoo();
或UsesFoo myMan;
)时,它会创建一个Foo
对象,就好像通过调用{{1} }}。当Foo(1, 2, 3)
被摧毁时(无论是UsesFoo
还是超出范围),内部的delete myMan;
也会被破坏。
如果我提供以下析构函数,Foo
仍然会被破坏吗?
Foo
如果没有,那么我该怎样做才能破坏~UsesFoo() { }
?换句话说,作为类实例的非指针成员变量如何被破坏的语义是什么?
答案 0 :(得分:5)
如果我提供以下析构函数,
Foo
仍然会被破坏吗?
是即可。标准,
执行析构函数体并破坏体内分配的任何自动对象后,a 类
X
的析构函数调用X
的直接非变量非静态数据成员的析构函数,析构函数 对于X
的直接基类,如果X
是派生类最多的类(12.6.2),则它的析构函数调用X
虚拟基类的析构函数。
(C ++ 11,§12.4/ 8)