笔记7 (复制控制)

来源:互联网 发布:linux 网络服务器 编辑:程序博客网 时间:2024/05/16 19:17

复制控制

复制构造函数、赋值操作符和析构函数总称为复制控制(copy control)。编译器自动实现这些操作,但类也可以定义自己的版本。

复制构造函数

只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。当定义一个新对象并用一个同类型的对象对它进行初始化时,将使用复制构造函数。当将该类型的对象传递给函数传递给函数或从函数返回该类型的对象时,将隐式使用复制构造函数。

复制构造函数可用于:

         根据另一个同类型的对象或隐式初始化一个对象。

         复制一个对象,将它作为实参付给一个函数

         从函数返回时复制一个对象。

         初始化顺序容器中的元素。

         根据元素初始化式列表初始化数组元素。

C++支持两种初始化形式:直接初始化和复制初始化。复制初始化使用=符号,而直接初始化将初始化式放在圆括号中。

当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参茶杯的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。

对于类类型对象,只有指定单个实参或创建一个临时对象用于复制时,才使用复制初始化。

形参和返回值:当形参或返回值为类类型时,由我见构造函数进行复制

合成的复制构造函数

编译器始终会合成复制构造函数,无论我们是否自己定义。合成复制构造函数的行为是,执行逐个成员(现在对象的每个非static成员)初始化,将新对象初始化为原对象的副本。

数组成员的复制是个例外。虽然一般不能复制数组,但如果一个类具有数组成员,则合成复制构造函数将复制数组。

定义自己的复制构造函数

对许多类而言,合成复制构造函数只完成必要的工作。只包含类类型成员或内置类型(但不是指针类型)成员的类,无须地定义复制构造函数,也可以复制。

有些类必须对复制对象时发生的事情加以控制。这样的类经常有一个数据成员是指针,或者有表示在构造函数中分配的其他资源。而另一些类在创建新对象时必须做一些特定工作。这两种情况下,都必须定义复制构造函数。

禁止复制

为了防止复制,类必须显式声明其复制构造函数为private(可做到屏蔽编译器合成的复制构造函数)。

赋值操作符

如果类没有定义自己的赋值操作符,则编译器会合成一个。

重载操作符:重载操作符是一些函数,其名字为operator后跟着所定义的操作符的符号。操作符函数有一个返回值和一个形参表。大多数据符可以定义为成员函数或非成员函数。当操作符为成员函数时,它的第一个操作数隐式绑定到this指针。

合成赋值操作符:执行逐个成员赋值,右操作数对象的每个成员赋值给左操作数对象的对应成员。

 

复制构造函数用于初始化,传参。

Class a = b;

Class a(b);

赋值操作符

Class a;

a = b;

 

析构函数

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

容器中的元素总是按逆序撤销。

析构函数通常用于德高望重在构造函数或在对象生命期内获取的资源。

如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这个常称为三法则。

合成析构函数按对象创建时的逆序撤销每个非static成员。

编写析构函数

析构函数是个成员函数,它的名字是在类名字之前加上一个代号字(~),它没有返回值,没有形参。用于对象超出作用域或需要删除对象时来清除对象。

即使我们编写了自己的析构函数,合成析构函数仍然运行。

编译器会为每个类合成析构函数。如果有些工作(如德高望重资源、执行特定操作等)需要析构函数完成,一个类就必须定义自己的析构函数。

管理指针成员