复制控制

来源:互联网 发布:linux mint 安装vim 编辑:程序博客网 时间:2024/06/04 21:46

1、复制控制

      每种类型定义了创建该类型对象时会发生什么的函数即:构造函数,同时类型还能控制复制、赋值或撤销该类型对象时会发生什么,这些是通过:复制构造函数、赋值构造函数和析构函数来控制这些行为的,三个函数总称为复制控制。

2、复制构造函数

     (1)定义

                只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。如:

                        Sales_item::Sales_item(const Sales_item) : isbn(orig.isbn), units_sold(orig.units_sold), 

                                                                                                                           revenue(orig.revenue)

                        {

            } 

     (2)调用复制构造函数的情况

                根据另一个同类型的对象显示或隐式初始化一个函数

                作为实参传给一个函数

                从函数返回一个该类型对象

                初始化顺序容器中的元素

                初始化数组中的元素

     (3)c++支持的两种初始化形式

               直接初始化,将初始化式放在圆括号中,它直接调用与实参匹配的构造函数。如:

                        string dots(10, '.');         

                        string empty_direct;

               复制初始化,使用“=”号初始化,它在初始化时,首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。如:

                       string null_book = "9-999-99999-9";

                       string empty_copy = string();

     (4)合成复制构造函数

               如果我们没有定义复制构造函数,编译器就会为我们合成一个。与合成默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数。合成复制构造函数会执行逐个成员初始化,将新对象初始化为原对象的副本。有些类必须对复制对象时发生的事情加以控制,包括:数据成员是指针类型,或有成员在构造函数中分配的其他资源,必须在创建新对象时做一些特定工作的类。

     (5)禁止复制

               为了防止复制,类必须显示声明其复制构造函数为private,然而类的友元和成员仍可以复制,如果也将这两类函数禁止,就可以声明一个private复制构造函数但不对其定义。

3、赋值构造函数

    (1)赋值构造函数

               赋值是二元运算,所以有两个参数,第一个参数对应左操作数,第二参数对应右操作数,当操作符为成员函数时,它的第一个操作数绑定到this指针,右操作数一般为从const引用。如:

                     Sales_item& operator=(const Sales_item&);

    (2)合成赋值操作符

               执行逐个成员复制,除数组外,每个成员用所属类型的常规方式进行赋值,对于数组,给每个数组元素赋值。              

4、析构函数

   (1)何时调用

             删除指定动态分配对象的指针或实际对象超出作用域时。

   (2)何时编写显示析构函数

             三法则:如果类需要析构函数,则它同时也需要赋值操作符和复制构造函数。

   (3)合成析构函数

               合成析构函数按照对象创建时的逆序撤销每个非static成员,对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。合成析构函数并不删除指针成员所指向的对象。析构函数与其他复制控制函数的一个重要区别是:即使编写了自己的析构函数,合成析构函数仍然运行。

5、管理指针成员

    (1)管理指针的方法

               采取常规指针行为,具有指针的所有缺陷,无需任何复制控制。

               采取“智能指针”行为,指针所指向的对象是共享的,但类能够防止悬垂指针。

               类采取值型行为,指针所指向的对象是唯一的,由每个类对象独立管理。

   (2)定义智能指针类

              定义一个计数类,这个类保存了需要管理的指针成员,并且定义需要能够指示多少个对象共享指针的size_t类型即:使用计数,当使用计数为0时删除该对象。如果不为零当进行复制时要增加使用计数,另外计数类应该将原始类设置为友元,原始类中应含有计数类的指针成员,当原始类第一次创建时同时也要创建计数类。

0 0