《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:析构函数释放对象在生存期分配的所有资源。

 

posted on 2021-04-06 21:43  QzZq  阅读(64)  评论(0)    收藏  举报

导航