编译器自动生成析构函数

zhuyf87 2013-02-23 05:06:29
今天翻《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 defined as deleted if:
...

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

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

...全文
494 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
whdugh 2013-10-03
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
你写了析构函数编译器就不会合成了,一个类只能有一个析构函数。
c++primer原话说,“析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行。”
prajna 2013-02-27
  • 打赏
  • 举报
回复
引用 6 楼 billzheng 的回复:
So do you mean that a class can have 2 destructors???
那好吧,这样说: 用户提供的“析构函数”,做用戶要做的事; 编译器合成的“析构函数”,做编译器要做的事。 如果问,引号怎么理解,我也不知道。
taodm 2013-02-24
  • 打赏
  • 举报
回复
不知道你的字典里是怎么解释“一定”的
引用 8 楼 zhuyf87 的回复:
引用 7 楼 taodm 的回复: 其实就是一句很简单的话:你写下的析构函数并不是真正的完整版的析构函数,一定要加上编译器自动生成的那部分。 只是,对若干简单类,编译器自动生成的那部分为空。 4 If a class has no user-declared destructor... 那是否如果有了user-declared destructor,编译器就不自动合成了呢? -_- ……
ri_aje 2013-02-24
  • 打赏
  • 举报
回复
引用 10 楼 zhuyf87 的回复:
引用 9 楼 ri_aje 的回复:你写了析构函数编译器就不会合成了,一个类只能有一个析构函数。 可是c++ primer说仍然会合成一个。
你还是把原文和具体章节发上来吧,这样别人也好刨一刨原作者到底怎么说的。目测不是翻译错误,就是理解错误,你自己也贴了标准,说得不是很清楚吗。
zhuyf87 2013-02-24
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
你写了析构函数编译器就不会合成了,一个类只能有一个析构函数。
可是c++ primer说仍然会合成一个。
ri_aje 2013-02-24
  • 打赏
  • 举报
回复
你写了析构函数编译器就不会合成了,一个类只能有一个析构函数。
zhuyf87 2013-02-24
  • 打赏
  • 举报
回复
引用 7 楼 taodm 的回复:
其实就是一句很简单的话:你写下的析构函数并不是真正的完整版的析构函数,一定要加上编译器自动生成的那部分。 只是,对若干简单类,编译器自动生成的那部分为空。
4 If a class has no user-declared destructor... 那是否如果有了user-declared destructor,编译器就不自动合成了呢? -_- 呵呵,好像这个问题不是很值得就纠结。
taodm 2013-02-23
  • 打赏
  • 举报
回复
其实就是一句很简单的话:你写下的析构函数并不是真正的完整版的析构函数,一定要加上编译器自动生成的那部分。 只是,对若干简单类,编译器自动生成的那部分为空。
billzheng 2013-02-23
  • 打赏
  • 举报
回复
引用 5 楼 gumh 的回复:
個人是這樣理解的: 用户提供的析构函数,做用戶要做的事; 编译器合成的析构函数,做编译器要做的事。
So do you mean that a class can have 2 destructors???
prajna 2013-02-23
  • 打赏
  • 举报
回复
個人是這樣理解的: 用户提供的析构函数,做用戶要做的事; 编译器合成的析构函数,做编译器要做的事。
billzheng 2013-02-23
  • 打赏
  • 举报
回复
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。
derekrose 2013-02-23
  • 打赏
  • 举报
回复
if then does not equal to if not then not
super_admi 2013-02-23
  • 打赏
  • 举报
回复
以C++语言为例:[1]析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。
super_admi 2013-02-23
  • 打赏
  • 举报
回复

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

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧