《C++Primer》读薄系列——第13章,拷贝控制
前面的话:定义一个类,会显式或隐式的指定在此类型的对象拷贝、移动、赋值和销毁时做什么。通过定义五种特殊的成员函数来控制这些操作,他们分别是:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。我们称这些操作是拷贝控制操作。
从拷贝构造函数开始:
Q1:什么是拷贝构造函数?
A1:如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值,则此构造函数就是拷贝构造函数。
Q2:为什么拷贝构造函数的第一个参数必须是引用?
A2:如果参数不是引用类型,则为了调用拷贝构造函数,必须拷贝它的实参,但为了拷贝实参,又需要调用拷贝构造函数,如此无限循环。
Q3:拷贝初始化何时发生?
A3:(1)使用 “=” 定义变量时;
(2)将一个对象作为实参传递给一个非引用类型的形参
(3)从一个返回类型为非引用类型的函数返回一个对象
(4)用花括号列表初始化一个数组中的元素或一个聚合类的成员
Note1:拷贝构造函数通常不应该是explicit的。
why1:如果使用explicit,那么拷贝初始化还是直接初始化就无关紧要了,因为不能隐式使用explicit构造函数,必须显式使用。并且拷贝构造函数在几种情况下都会隐式的使用。
Note2:如果我们没有为类定义拷贝构造函数,编译器也会为我们定义一个。但是,与默认构造函数不同:即使我们定义了其他构造函数,编译器也会为我们合成一个拷贝构造函数。合成的拷贝构造函数会将其每个非static的成员逐个拷贝到正在创建的对象中。
接下来是拷贝赋值运算符:
Note1:与类控制其对象如何初始化一样,类也可以控制其对象如何赋值。同时,如果类未定义自己的拷贝赋值运算符,则编译器会为它合成一个。合成拷贝赋值运算符返回一个指向其左侧运算对象的引用。
接下来是析构函数:
Q1:析构函数是什么?
A1:析构函数与构造函数相反,析构函数释放对象使用的资源,销毁非static的数据成员。
Q2:析构函数是做什么的?
A2:析构函数释放对象在生存期分配的所有资源。
浙公网安备 33010602011771号