第13章 复制控制(1)
复制构造函数(copy constructor)是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式使用复制构造函数。
析构函数(destructor)是构造函数的互补:当对象超出作用域或动态分配的对象被删除时,将自己应用析构函数。析构函数可用于释放对象时构造或在对象的生命期中所获取的资源。不管类是否定义了自己的析构函数,编译器都自动执行类中非static数据成员的析构函数。
赋值操作符(assignment operator)可以通过指定不同类型的右操作数而重载。右操作数为类类型的版本比较特殊:如果我们没有编写这种版本,编译器将为我们合成一个。
复制构造函数、赋值操作符和析构函数总称为复制控制(copy control)。编译器自动实现这些操作,但类也可以定义自己的版本。
有一种特殊常见的情况需要类定义自己的复制控制成员的:类具有指针成员。
13.1 复制构造函数
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。与默认构造函数一样,复制构造函数可由编译器隐式调用。复制构造函数可用于:
根据一个同类型的对象显式或隐式初始化一个对象。
复制一个对象,将它作为实参传递给一个函数。
从函数返回时复制一个对象。
初始化顺序容器中的元素。
根据元素初始化式列表初始化数组元素。
1. 对象的定义形式
C++支持两种初始化形式:直接初始化和复制初始化。复制初始化使用=符号,而直接初始化将初始化式放在圆括号中。
当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。
StaticClass cs1();
StaticClass cs2 = StaticClass();
对于类类型对象,只有指定单个实参或显式创建一个临时对象用于复制时,才使用复制初始化。
由于不能复制IO类型的对象,所以不能对那些类型的对象使用复制初始化。
2. 形参与返回值
当形参为非引用类型的时候,将复制实参的值。类似地,以非引用类型做返回值时,将返回return语句中的值的副本。
当形参或返回值为类类型时,由复制构造函数进行复制。
3. 初始化容器元素
复制构造函数可用于初始化顺序容器中的元素。例如,可以用表示容量的单个形参来初始化容器。容器的这种构造方式使用了默认构造函数和复制构造函数。
vector<string> vec(5);
作为一般规则,除非你想使用容器元素的默认初始值,更有效的办法是,分配一个空容器并将已知元素的值加入容器。
4. 构造函数和数组元素
如果没有为类类型数组提供元素初始化式,则将用默认构造函数初始化每个元素。然而,如果使用常规的花括号括住的数组初始化列表来提供显式元素初始化式,则使用复制初始化来初始化每个元素。根据指定值创建适当类型的元素,然后用复制构造函数将该值复制到相应元素。
class Class5
{
public:
int k;
Class5(int i): k(i){}
};
Class5 arr[4] = {1, 2, 3, Class5(4)};
摘自 xufei96的专栏
补充:软件开发 , C++ ,