【发布时间】:2019-09-12 19:05:45
【问题描述】:
在 Bjarne Stroustrup 的“C++ 编程语言(第 4 版)”第 17.6 节(生成默认操作)中提到了这一点:
如果程序员声明了复制操作、移动操作或 类的析构函数,没有复制操作,移动操作,或 为该类生成析构函数。
因此,我很困惑为什么在这个程序中调用了 SubObj 析构函数:
#include <iostream>
using namespace std;
class SubObj {
public:
~SubObj() {
cout << "SubObj Destructor called" << endl;
}
};
class Obj {
private:
SubObj so;
public:
Obj() {};
Obj(const Obj& o) {};
};
int main() {
Obj();
cout << "Program end" << endl;
}
使用 g++ 编译时,我得到以下输出:
$ ./a.out
SubObj Destructor called
Program end
根据我的理解,我预计 Obj 的默认析构函数不会自动生成,因为我为 Obj 定义了一个复制操作。因此,我预计Obj 的SubObj 成员不会被销毁,因为Obj 没有析构函数。
因此,我想知道:即使没有析构函数,对象成员也会自动销毁吗?还是在这个例子中自动生成了析构函数?
编辑:
在本书的后面(17.6.3.4),当提到一个例子时,Bjarne 提到:
我们定义了复制赋值,所以我们还必须定义析构函数。 该析构函数可以是
=default,因为它需要做的就是 确保成员pos被破坏,这就是 如果没有定义复制分配,无论如何都已经完成了。
根据目前的答案,听起来 Bjarne 可能只是在这个问题上错了。
【问题讨论】:
-
顺便说一句,这样就好了,避免轻易打破 3/5 规则。
-
@LightnessRacesinOrbit:是的...已删除
标签: c++ c++11 destructor