11:构造函数中,分配的动态内存对象,需要delete
~HasPtr() { delete ps; }//必须首先delete对象ps,ps指向一个动态分配的string
12:知识点:当指向一个对象的引用或者指针离开作用域是,析构函数并不会执行
析构函数执行三次:accum,item1,item2
13:
#include
#include
#include
#include
#include
#include
14:知识点:这五种操作通常被视为一个整体,一般来说都会一起出现
知识点2:需要析构函数的类也需要拷贝和赋值操作,合成的析构函数不会delete一个指针数据成员,所以有时我们需要自己定义一个析构函数释放构造函数分配的内存,所以需要析构函数的类,也就需要拷贝构造函数和拷贝赋值运算符,而合成的拷贝构造函数和拷贝赋值运算符只能简单的拷贝指针成员,这就意味着多个对象指向同一个内存,释放多个对象时,造成多次delete
知识点3:如果一个类需要自定义版本的析构函数,那么肯定是需要自定义的拷贝构造函数和拷贝赋值运算符
知识点4:拷贝操作和复制操作是相互结合的,如果需要一种,也需要另一种,但不一定意味着需要析构函数
会输出三个一样的数字,合成的拷贝构造函数只是简单的进行拷贝
15:使用了自定义版本的合成构造函数,生成新的序号,那么肯定输出就是三个不一样的数字了
16:函数的参数变为引用版本的形参,无需拷贝,结果改变,但输出仍为三个不一样的数字
17:
#include
#include
#include
#include
#include
#include
18:知识点1:我们可以通过将拷贝控制成员定义为 =default 来显式的要求编译器生成合成的版本(只能对有合成版本的函数使用),在此之后,合成的函数将隐式的声明为内联
知识点2:iostream类阻止了拷贝,避免多个对象同时写入,或读取相同的IO缓冲,我们可以将拷贝构造函数和拷贝赋值运算符定义为删除的函数来阻止拷贝,虽然声明了他们,但不能以任何的方式使用他们,在参数列表之后加上 =delete 来指出我们希望其是被删除的,这是为了通知编译器,我们不希望这些函数被定义
知识点3:可以对任何类内函数(析构函数除外)声明 =delete ,且必须出现在函数第一次声明的时候,如果析构函数被声明=delete ,析构函数被删除,就无法销毁此类型的对象
知识点4:本质上,当不可能拷贝、赋值、销毁类的成员时,类的拷贝构造函数会被定义为删除的
知识点5:C++11之前,是将拷贝构造函数和拷贝赋值运算符定义为private来阻止拷贝的(旧标准)
见下方19题:
19:拷贝控制成员:拷贝构造函数和拷贝赋值运算符
#include
#include
#include
#include
#include
#include
20:
TextQuery和QueryResult所有成员(包括智能指针和容器)都将被拷贝