C++ Primer复制控制 13.3 析构函数

转载 2016年06月01日 20:55:28

   如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则。这个规则常称为三法则,指的是如果需要析构函数,则需要所有这三个复制控制成员。

         复制构造函数或赋值操作符不同,编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static 成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。

 当用户没有显式定义析构函数时, 编译器同样会为对象生成一个默认的析构函数, 但默认生成的析构函数只能释放类的普通数据成员所占用的空间, 无法释放通过 new 或malloc 进行申请的空间, 因此有时我们需要自己显式的定义析构函数对这些申请的空间进行释放, 避免造成内存泄露。

 

可以看出,析构函数在 main 函数运行结束前被执行,并且调用顺序和构造函数正好相反,为了方便记忆,我们可以将之理解为一个栈,先入后出。

析构函数在对象被销毁前执行;要知道析构函数什么时候被调用,就要先知道对象什么时候被销毁。

对象可以认为是通过类这种数据类型定义的变量,它的很多特性和普通变量是一样的,例如作用域、生命周期等。由此可以推断,对象这种变量的销毁时机和普通变量是一样的。

总结起来,有下面几种情况:
1) 如果在一个函数中定义了一个对象(auto 局部变量),当这个函数运行结束时,对象就会被销毁,在对象被销毁前自动执行析构函数。

2) static 局部对象在函数调用结束时并不销毁,因此也不调用析构函数,只有在程序结束时(如 main 函数结束或调用 exit 函数)才调用 static 局部对象的析构函数。

3) 如果定义了一个全局对象,也只有在程序结束时才会调用该全局对象的析构函数。

4) 如果用 new 运算符动态地建立了一个对象,当用delete 运算符释放该对象时,先调用该对象的析构函数。

注意:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以分配给新对象使用。


C++primer plus第六版课后编程题答案13.3

abstractABC.cpp #include #include using namespace std; class DMA{ private: string label;//为了方便,我...
  • guang_jing
  • guang_jing
  • 2014年04月23日 14:33
  • 1293

C++ Primer学习总结 第13章 拷贝控制

第13章 拷贝控制 1.    什么是拷贝构造函数? P440 如果一个类的构造函数的第一个参数是自己类类型的引用, 且所有其他参数都有默认值, 那么这就是一个拷贝构造函数. ...
  • u013480600
  • u013480600
  • 2015年03月09日 10:33
  • 1431

C++ Primer(复制控制)

第13章 复制控制 复制构造函数、赋值操作符和析构函数总称为复制控制。 编译器自动实现这些操作,但类也可定义自己的版本。有一种特别常见的情况需要类定义自己的复制控制成员的:类具有指针成员。 13...
  • cfcf0517
  • cfcf0517
  • 2014年12月31日 13:35
  • 228

C++ Primer 复制控制

复制控制: 当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么——这是通过定义特殊成员:复制构造函数、赋值操作符和析构函数来达到的。如果没有显式定义复制构造函数或赋...
  • wangxueang224
  • wangxueang224
  • 2014年06月06日 20:00
  • 410

c++ primer plus(第6版)中文版 第十三章编程练习答案

第十三章编程练习答案 13.1根据Cd基类,完成派生出一个Classic类,并测试 //13.1根据Cd基类,完成派生出一个Classic类,并测试 #include #include usi...
  • gd275313
  • gd275313
  • 2014年05月26日 22:31
  • 1218

C++ Primer 学习笔记——拷贝控制

拷贝构造函数直接初始化:编译器使用普通的函数匹配,来选择与我们提供的参数最匹配的构造函数 拷贝初始化:将右侧的对象拷贝到正在创建的对象中,通常使用拷贝构造函数来完成调用拷贝构造函数 除了=还有, 将...
  • amy260231120
  • amy260231120
  • 2016年03月07日 14:54
  • 126

C++ Primer(十三) 复制控制

复制构造函数、赋值操作符、析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。 13.1 复制构造函数 只有单个形参,并且该形参类型是对本类类型对象的引用,这样的构造函数称作...
  • ws891033655
  • ws891033655
  • 2014年06月19日 21:26
  • 460

C++ Primer 有感(复制控制)

1.不管类是否定义了自己的析构函数,编译器都 自动执行类中非static数据成员的析构函数。 2.如果我们没有定义复制构造函数,编译器就会为我们合成一个。合成复制构造函数的行为是,执行逐个成员初始化,...
  • ctthunagchneg
  • ctthunagchneg
  • 2013年06月30日 10:27
  • 1130

《C++ Primer》真的适合入门吗?

客气地说,《C++ Primer》不适合大学C++基础课堂教学,也不适合初学者入门。 不客气地说,恐怕你们的大学老师也搞不定《C++ Primer》,更别说拿这本书教学生了。 更不客气地说...
  • qq_23291783
  • qq_23291783
  • 2015年12月22日 16:32
  • 964

如何学习C++ primer 第五版

作者:dawnmist 链接:http://www.zhihu.com/question/32087709/answer/54936403 来源:知乎 著作权归作者所有,转载请联系作者获得授权。...
  • w3071206219
  • w3071206219
  • 2016年08月22日 22:03
  • 856
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Primer复制控制 13.3 析构函数
举报原因:
原因补充:

(最多只允许输入30个字)