C++复制控制

来源:互联网 发布:mysql数据库放在哪里 编辑:程序博客网 时间:2024/06/03 19:21
   复制控制:当定义一个新的类型的时候,需要显示和隐式地指定复制,赋值和撤销该类型的对象时会发生什么,
   这是通过定义特殊成员:复制构造函数,赋值操作符和析构函数来达到的。

   复制构造函数(copy constructor ):是一种特殊的函数,具有单个形参,该形参(常用const)是对
   该类型的引用.当定义一个新对象时并用一个同类型的对象对他进行初始化时,将显示使用复制构造函数.
   当将该类型的对象传递给函数或冲函数返回该类型的对象时,将隐式使用复制构造函数.

   赋值操作符(=):与构造函数一样,赋值操作符可以通过指定不同类型的右操作数而重载。右操作数为类类型的版本比较特殊:
   如果我们没有编写这样的版本,那么编译器将为我们合成一个。

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

   通常,编译器合成的复制控制是非常精炼的-------他们只做必要的工作。但是对某些类而言,依赖于默认的定义
   会导致灾难。实现复制控制操作最困难的部分,往往在于识别何时需要覆盖默认的版本.有一种特别常见的情况需要
   类定义自己的复制控制成员的:类具有指针的成员

   一.复制构造函数
      1.对象的定义形式
         cpp支持两种初始化形式:直接初始化和复制初始化。复制初始化调用=符号,而直接初始化将初始化式放在圆括号中.
         当用于类类型对象时,初始化的复制形式和直接初始化有所不同:直接初始化自己接调用与形参匹配的构造函数.
        复制初始化总是调用复制构初始化总是调用复制构造函数。复制初始化式首先使用指定构造函数创建一个临时对象
         然后用复制构造函数将那个临时对象复制到正在创建的对象。
         string null_book = "99999" ;     // copy-initialization
         string dots(10,'.') ;            // direct-initialization
         string empty_copy = string() ;   // copy-initializaton
         string empty_direct ;            // direct-initialization
         null_book对象定义时将直接调用string类的复制构造函数,即拷贝构造函数
         dots对象定义时直接调用对应的构造函数
         empty_copy对象定义时先调用string的默认构造函数生成一个临时的对象,然后通过拷贝构造函数将其复制到empty_copy中
         empty对象定义时直接调用默认的构造函数


      2.形参与返回值
         当形参为非引用类型的时候,将复制实参的值。类似地,以非引用类型作返回值时将返回return 语句中的值的副本.
         当形参或返回值为类类型时,由复制构造函数进行复制


      3.初始化容器元素
         复制构造函数可用于初始化顺序容器中的元素。例如,可以用表示容量的单个形参来初始化容器.
         容器的这种构造方式使用了默认构造函数和复制构造函数
         vector<string> svec(5) ;
        编译器首先使用string 的默认构造函数创建一个临时值来初始化svec,然后使用复制构造函数将临时值复制到
         svec的每一个元素。
         
  二.赋值操作符
     1.与类要控制初始化对象的方式一样,类页定义了该类型对象复制时会发生什么。
       与复制构造函数一样,如果程序没有定义自己的赋值操作符,编译器会生成一个默认的。
     2.一般而言,如果类需要复制构造函数,他也会需要赋值操作符。实际上应将两个操作符看成是一个单元,如果需要其中一个
       我们几乎可以肯定需要另外一个。


  三.析构函数
     很多类不需要显式的析构函数,尤其是具有构造函数的类不一定需要定义自己的析构函数。仅在有些工作需要析构函数完成时,
     才需要析构函数。析构函数通常用来释放在构造函数或在对象生命期内获取的资源.

    如果类需要析构函数,则他也需要赋值操作符合复制构造函数,这是一个有用的经验法则。
     析构函数并不仅限于释放资源。一般而言,析构函数可以执行任意操作,该操作是类设计者希望在该对象使用完毕后执行的操作

原创粉丝点击