c++ 复制控制 之析构函数

 1.什么是析构函数

析构函数(destructor)也是一种成员函数,但它的作用与构造函数相反,用来在系统释放对象前做一些清理工作,如利用delete运算符释放临时分配的内存,清零某些内存单元等.当一个对象生存期结束时,系统会自动调用该对象所属类的析构函数;

构造函数的名称与类名相同,而析构函数的名称必须在类名前加上"~"符号;注意,构造函数和析构函数不能指定任何返回值类型,包括void返回类型.

2.何时调用析构函数

撤销类对象时会自动调用析构函数( 变量在超出作用域时应该自动撤销),  动态分配的对象只有在指向该对象的指针被删除时才撤销.

#include <iostream>
using namespace std;
class Test
{
  public:
   Test() { }

   ~Test()
   {
     cout<<"This is a ~Test() " <<endl;
   }

};  

int main()
{
  Test A;
  Test *ptr = new Test();
  delete ptr;
  return 0;
}

该程序调用了两次析构函数, 第一次是在删除ptr时, 第二次是遇到右括号时.

如果类需要析构函数, 则它也需要赋值操作符和复制构造函数, 这是一个有用的经验法则.

4.合成析构函数

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

5.虚析构函数与纯虚析构函数,这里直接发个链接吧,
是别人写的博文, 讲挺好的 点击打开链接.

时间: 2024-09-28 16:16:06

c++ 复制控制 之析构函数的相关文章

第十九篇:复制控制( 下 ) --- 自定义析构函数

前言 经过前两篇随笔( 上  中 )的分析我们已经解决了具有指针成员的同类对象“ 干涉 ”问题.可惜,前面给出的解决方案代码还是不完整.还有什么问题呢?观察发现,构造函数里面有new的关键字出现,也就是说开辟了新的内存空间,我们也知道new必须也只能对应一个delete,而不应该让系统自己处理( 还不熟练new和delete用法的点这里 ),但这里和new对应的delete去哪里了? 解决思路 应该何时delete?显然,应该在对象销毁的时候delete.C++中定义了这样一种函数 --- 析构

稍微深入点理解C++复制控制【转】

通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销该类的对象时会发生什么. 2.复制构造函数(copy constructor)是一种特殊的构造函数,具有单个形参,该形参(常用const)是对该类类型的引用: 当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用复制构造函数: 当将该类的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造

C++拾遗(六)——复制控制

年前忙了几天,到现在才算是有空休息下来.先祝大家新年快乐,心想事成:)我也会发笑脸o.o 这篇博文主要介绍定义一个类型的对象时的复制控制方式,这部分内容之前有一定的了解但又浅尝辄止,始终感觉没能找到要点.年前又拿起书细细品读,算是有了一点新的了解.几天前就想动笔了,一直没时间,拖到现在. 每种类型定义了创建该类型的对象时会发生什么——构造函数定义了该类类型对象的初始化.类型还能控制复制.赋值或撤销该类型的对象时会发生什么——类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制这些行为.

C++之重载String ----- 构造函数、复制控制、重载操作符

本博文 我们通过 重新实现String类 来说明构造函数,复制控制,重载操作符. 一.构造函数(包括析构函数): 1:默认构造函数: 2:用户自己定义的构造函数 注意:当用户自己定义时,也要明确显示默认构造函数,这是因为,当我们没有定义自己的构造函数时,编译器会为我们自动合成一个,而我们定义了构造函数时,编译器默认构造函数改为我们自己定义的.这时就有可能出现错误: 3:析构函数: 具体声明与实现,代码如下: 1 声明部分: 2 String(); 3 String(const char*s);

C++复制控制

1.复制构造函数可用于: (1)根据另一个同类型的对象显示或隐式初始化一个对象 string str1="test";   //隐式 string str2=str1; //显示 str1为先调用string的字符串形参的构造函数,创建一个临时对象,然后,使用string复制构造函数将str1初始化为那个临时对象的副本. (2)复制一个对象,将它作为实参传给一个函数 (3)从函数返回时复制一个对象 当形参为非引用类型的时候,将复制实参的值.类似地,以非引用类型作返回值时,将返回retu

c++OOP之复制控制 ------复制构造函数、赋值重载、析构

本博文我们讨论OOP复制控制的一些内容: 首先考虑对象复制的时机: 非引用类型 1):根据一个类去显式或者隐式初始化一个对象: 2):复制一个对象,将它作为实参传给一个函数: 3):从函数返回时复制一个对象.(string tolittle(string word)) 一个空类,编译器提供默认无参数构造函数.拷贝构造函数.赋值运算符以及析构函数,一共四个函数.(面试) 11.复制构造函数.赋值运算符以及析构函数,称为三法则,一旦提供了其中一个,务必提供其余两个.以String为例: a) 涉及到

C++ Primer 学习笔记_68_面向对象编程 --构造函数和复制控制[续]

面向对象编程 --构造函数和复制控制[续] 三.复制控制和继承 合成操作对对象的基类部分连同派生类部分的成员一起进行复制.赋值或撤销,使用基类的复制构造函数.赋值操作符或析构函数对基类部分进行复制.赋值或撤销. 类是否需要定义复制控制成员完全取决于类自身的直接成员.基类可以定义自己的复制控制而派生类使用合成版本,反之,基类使用合成版本,而派生类使用自己定义的复制控制也可以. 只包含类类型或内置类型的数据成员.不包含指针的类一般可以使用合成操作,复制.赋值或撤销这样的成员不需要使用特殊控制.但是:

复制控制(下)

消息处理示例 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message 类和 Folder 类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message 上有 save 和 remove 操作,用于在指定 Folder 中保存或删除该消息.对每个 Message,我们并不是在每个 Folder 中都存放一个副本,而是使每个 Message 保存一个指针集(set),set 中的指针指向

复制控制

复制控制:分为复制构造函数.赋值操作符和析构函数.编译器自动实现这么操作,但类也可以定义自己的版本. 复制构造函数:只有单个形参,且形参是对本类类型对象的引用(常用const修饰)的构造函数. 赋值操作符:接受单个形参,且该形参是同一类类型的对象.由操作数一般作为const引用传递. 析构函数:可以分配一个缓冲区或打开一个文件,在析构函数中分配了资源之后,需要一个对应操作自动回收或释放资源.