美文网首页
C++ Copy Constructor

C++ Copy Constructor

作者: FakeCSer爱去网吧 | 来源:发表于2020-04-29 15:15 被阅读0次

    形式如此,用一个对象给另一个同类对象初始化

    X::X(const X& x)
    {
    a = x.a;
    b = x.b;
    }
    

    如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有程序员自定义的一个拷贝构造函数。

    • 拷贝构造函数使用的场景

      1. 显示初始化操作X xx = x;
      2. 对象做参数传递给函数的时候
      3. 函数传回一个类对象时
    • 不同场景下构造函数的使用

      1. 显示初始化操作
    X x0;
    void foo_bar()
    {
        X x1(x0);
        X x2 = x0;
        X x3 = X(x0);
    }
    

    会被转换成下面的过程(两个阶段)1.定义类对象 2.调用对象拷贝构造函数

    X x0;
    void foo_bar()
    {
        X x1;
        X x2;
        X x3;
    
        x1.X::X(x0);
        x2.X::X(x0);
        x3.X::X(x0);//调用 X::X(const X& xx)
    }
    
    1. 参数的初始化
    void foo(X x0);//声明
    X xx;
    foo(xx);
    

    会被转换成实际如下:

    voif foo(X& x0);//转化为引用
    X _temp0;//编译器产生出来临时对象
    _temp0.X::X(xx);
    foo(_temp0);
    
    1. 返回值的初始化
    X bar()
    {
        X xx;
        //处理xx
        return xx;
    }
    

    转化

    void
    bar( X&__result )//传入引用类型的返回值
    {
         X xx;
         xx.X::X();//调用默认构造函数
        //....处理xx
         __result.X::XX(xx);//copy构造函数
        return;
    }
    

    将编译器必须把程序中每一个bar都转化了

    X xx = bar();
    //会被转化为
    X xx;
    bar(xx);
    
    bar().memfunc();//执行bar返回值的成员函数
    //会被转化为
    X __temp0;
    ( bar(__temp0),__temp0).memfunc();
    
    //函数指针
    X (*pf)();
    pf = bar;
    //被转化为
    void (*pf)(X&);
    pf = bar;
    
    • 对于返回一个对象(即3)编译器做的优化:NRV(named return value)
    //原函数
    X bar()
    {
        X xx;
        //处理xx
        return xx;
    }
    //转化为
    void
    bar( X&__result )//传入引用类型的返回值
    {
         X xx;
         xx.X::X();//调用默认构造函数
        //....处理xx
         __result.X::XX(xx);//copy构造函数
        return;
    }
    //优化为
    void
    bar ( X&__result)
    {
         __result.X::X();
    //直接处理__result
         return;
    }
    

    将要返回的

    相关文章

      网友评论

          本文标题:C++ Copy Constructor

          本文链接:https://www.haomeiwen.com/subject/kxcgwhtx.html