zoukankan      html  css  js  c++  java
  • copy control 复制控制

    每种类型,无论是内置类型还是类类型,都对该类型对象的一组(可能为空的)操作的含义进行了定义.比如,我们可以将两个int值相加,运行vector对象的size操作,等等.这些操作定义了用给定类型的对象可以完成什么任务.

    复制构造函数,赋值操作符析构函数总称为复制控制(copy control).

    编译器自动实现这些操作,但类也可以定义自己的版本.

    复制构造函数:

    直接初始化 和 复制初始化.

    string null_book = "9-99-99999-9";// copy-initialization

    string dots(10,'.');                         // direct-initializaton

    string empty_copy=string();           // copy-initialization

    string empty_direct;                      // direct-initialization

    合成的复制构造函数

    如果我们没有定义复制构造函数,编译器会给我们合成一个.与合成的默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数.合成复制构造函数(synthesized copy constructor)的行为是,执行逐个成员初始化(memberwise initialize),将新对象初始化为原对象的副本.

    所谓"逐个成员",指的是编译器将现有对象的每个非static成员,依次复制到正创建的对象.只有一个例外,每个成员的类型决定了复制该成员的含义.

    合成复制构造函数直接复制内置类型成员的值.

    类类型成员使用该类的复制构造函数进行复制.

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

    Sales_item :: Sales_item(const Sales_item &rhs):
    	isbm( rhs.isbn  ),		//calls string copy constructor
    	units_sold ( rhs.units_sold),	//copy rhs.units_sold
    	revenue (rhs.revenue)
    { }
    
    

    禁止复制,类必须显式声明其复制构造函数为private.

    合成赋值操作符(synthesized assignment operator),与合成复制构造函数类似.它会逐个成员赋值 (memberwise assignment).

    e.g. Sales_item的合成赋值操作符可能如下所示:

    //equivalent to the synthesized assignment operator
    
    Sales_item & Sales_item::operator = (const Sales_item & rhs){
    	isbm = rhs.isbn;//calls string::operator =
    	units_sold = rhs.units_sold; //use built-in int assignment
    	revenue =rhs.revenue;
    	return *this;
    }
    

    demo:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class my_class{
    public:
        int a;
        string s;
        char ch[10];
        void to_s(){
            cout<<"a address:"<<&a<<",a val:"<< a<<","<<endl
            <<"s address:"<<&s<<",s val:"<<s<<"," <<endl
            <<"ch address:"<<&ch<<",ch val:"<<ch<<endl;
        }
    };
    int main()
    {
        my_class obj;
        obj.a=10;
        obj.s="danniswu吴";
        obj.ch={'h','e','l','\0'};
        obj.to_s();
    
        my_class obj2(obj);
        obj2.to_s();
        return 0;
    }
    
    

    如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则.这个规则常称为 三法则(rule of three), 指的是如果需要析构函数,则需要所有这三个复制控制成员.

  • 相关阅读:
    js- 类数组对象
    js- caller、 callee
    ES6 声明变量的6种方法
    Vue 之 element-ui upload组件的文件类型
    js中call、apply和bind的区别
    Vue 之 Vue.nextTick()
    DocumentFragment --更快捷操作DOM的途径
    Js 编程题汇总
    &#65279
    网站添加变量后变成空白
  • 原文地址:https://www.cnblogs.com/wucg/p/1860959.html
Copyright © 2011-2022 走看看