读书人

编译器自动生成析构函数解决思路

发布时间: 2013-03-01 18:33:02 作者: rapoo

编译器自动生成析构函数
今天翻《c++ primer 4th》时,关于“析构函数”,有如下描述:
“与复制构造函数或赋值操作符不同,编译器总是会为我们合成一个析构函数。
...
析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行。

也就是说,无论是否为类显示提供析构函数,编译器都会自动生成一个(它提供的)析构函数。

然后我翻了一下c++ 11文档(ISO/IEC 14882),里面关于“析构函数”这一节,第4条:

4 If a class has no user-declared destructor, a destructor is implicitly declared as defaulted (8.4). An implicitly-declared destructor is an inline public member of its class.
5 A defaulted destructor for a class X is de?ned as deleted if:
...

这第4条提了个前提条件:“If a class has no user-declared destructor”。我E文不好,请问大虾们,这与《c++ primer》的描述冲突不?标准是否是说,如果一个类没有用户提供的析构函数,才由编译器合成一个默认的析构函数?

请大家帮忙解惑,回帖有分。谢谢大家。*^_^*


[解决办法]


以C++语言为例:[1]析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

--摘自百度百科(嘿嘿)
[解决办法]
以C++语言为例:[1]析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

[解决办法]
if then does not equal to if not then not
[解决办法]
4 If a class has no user-declared destructor, a destructor is implicitly declared as defaulted (8.4). An implicitly-declared destructor is an inline public member of its class.

翻译:
如果一个类没有用户自定义析构函数,析构会被隐式地申明(普通说法:编译器会自动为这个类生成一个析构函数)。 一个隐式生成的析构函数自动inline。
[解决办法]
人是理解的:

用户提供的析构函数,做用要做的事;
编译器合成的析构函数,做编译器要做的事。
[解决办法]
引用:
人是理解的:

用户提供的析构函数,做用要做的事;
编译器合成的析构函数,做编译器要做的事。

So do you mean that a class can have 2 destructors???
[解决办法]
其实就是一句很简单的话:你写下的析构函数并不是真正的完整版的析构函数,一定要加上编译器自动生成的那部分。
只是,对若干简单类,编译器自动生成的那部分为空。
[解决办法]
你写了析构函数编译器就不会合成了,一个类只能有一个析构函数。
[解决办法]
引用:
引用:你写了析构函数编译器就不会合成了,一个类只能有一个析构函数。

可是c++ primer说仍然会合成一个。

你还是把原文和具体章节发上来吧,这样别人也好刨一刨原作者到底怎么说的。目测不是翻译错误,就是理解错误,你自己也贴了标准,说得不是很清楚吗。
[解决办法]
不知道你的字典里是怎么解释“一定”的
引用:
引用:
其实就是一句很简单的话:你写下的析构函数并不是真正的完整版的析构函数,一定要加上编译器自动生成的那部分。
只是,对若干简单类,编译器自动生成的那部分为空。

4 If a class has no user-declared destructor...
那是否如果有了user-declared destructor,编译器就不自动合成了呢?


-_-
……

读书人网 >C++

热点推荐