C++13.3 析构函数destructor

来源:互联网 发布:ubuntu 桌面壁纸 编辑:程序博客网 时间:2024/06/06 11:02

简介

  • 析构函数写法:~Sale_item(){}

  • 构造函数的一个用途是自动获取资源。例如,构造函数可以分配一个缓冲区或打开一个文件,在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源,这就是析构函数的功能。

  • 撤销类对象时会自动调用析构函数

=======================================================================================================

  • 构造函数的一个用途是自动获取资源。例如,构造函数可以分配一个缓冲区或打开一个文件,在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源,这就是析构函数的功能。

一、何时调用析构函数

  • 撤销类对象时会自动调用析构函数
Sale_item *p=new Sale_item;{   Sale_item item(*p);//新建一个item对象,同时隐式调用复制构造函数将*p复制给item   delete p;//删除指向动态对象的指针}//变量在超出作用域时应该自动撤销,因此,当遇到花括号时,将运行item的析构函数。
  • 动态分配的对象只有在指向该对象的指针被删除时才撤销。如果没有删除指向动态对象的指针,则不会运行该对象的析构函数,对象就一直存在,从而导致内存泄露,而且,对象内部使用的任何资源也不会释放。

  • 当对象的引用或指针超出作用域时,不会运行析构函数,只会删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。

  • 撤销一个容器(标准库或内置数组)时,也会运行容器中的类类型元素的析构函数

Sale_item *p=new Sale_item[10];//动态分配内存空间,定义一个类类型数组vector<Sale_item> vec(p,p+10);//定义一个容器vec,里面放的Sale_item类类型的对象,9.1节顺序容器的初始化//默认初始化为指针p和p+10之间的元素//。。。。。。。。delete [] p;//容器中的每个类类型元素都会运行析构函数
  • 容器中的元素总是按逆序撤销:首先撤销下标为size()-1的元素。。直至最后撤销下标为0的元素

二、何时编写显示析构函数

  • 有些类不需要显示析构函数,尤其是具有构造函数的类不一定需要定义自己的析构函数。

  • 仅在有些工作需要析构函数完成时,才需要析构函数。析构函数通常用于释放在构造函数或在对象生命期内获取的资源。

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

  • 析构函数并不仅限于用来释放资源。一般而言,析构函数可以执行任意操作,该操作是类设计者希望在该类对象的使用完毕之后执行的。

三、合成析构函数

  • 与复制构造函数和赋值操作符不同,编译器会为我们合成一个析构函数(哪里不同了?????)

  • 合 成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员。

  • 对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。

  • 撤销内置类型成员或复合类型的成员没有什么影响。尤其是,合成析构函数并不删除指针成员所指的对象。

四、编写析构函数

  • Sale_item类是类,没有分配资源因此不需要自己的析构函数。

  • 分配了资源的类一般需要定义析构函数以释放那些资源。

  • 析构函数是个成员函数,它的名字是在来名字之前加上一个代字号 “~”。它么有返回值,没有形参,但只能提供一个析构函数,应用与类的所有对象。

  • 析构函数与复制构造函数和赋值操作符之间一个重要区别,即使我们编写了自己的析构函数,合成析构函数仍然运行。

class Sale_item{public:   ~Sale_item(){}};//撤销Sale_item类型的对象时,将运行这个什么也不做的析构函数,它执行完毕后,将运行合成析构函数以撤销类成员。//合成析构函数调用string析构函数来撤销string成员。string析构函数释放了保存isbn的内存。units_sold和revenue成员是内置类型,所以,合成析构函数撤销他们不需要做什么。
0 0
原创粉丝点击