• 【C++】复制构造函数


    参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题)

    用到复制构造函数的情况:

    1.函数值传递

    2.返回对象

    3.用一个对象初始化另一个对象

    重点注意下面两种情况:

    ① 只调用复制构造函数,不会生成临时变量

      A a = b;

    ② 会产生临时变量,会调用复制构造函数和赋值函数

      A a;

      a = A(b);

    #include<iostream>
    using namespace std;
    
    class hyong
    {
    public:
        int a, b, c;
        hyong()
        {
            a = b = c = 0;
            cout << "construct" <<endl;
        }
        hyong(int i)
        {
            a = b = c = i;
            cout << "construct 2" <<endl;
        }
        hyong(const hyong &obj)  //复制构造函数
        {
            a = b = c = 9;
            cout << "construct copy" <<endl;
        }
        void h(hyong k) //值传递
        {
            cout << "k.a = " << k.a << " k.b = " << k.b<< endl;
        }
        hyong & hyong::operator = (const hyong & other)
        {
            cout << "=" << endl;
            if(this == &other)
                return *this;
            a = other.a;
            b = other.b;
            c = other.c;
            return *this;
        }
    
        ~hyong()
        {
            cout << "xigou" << endl;
        }
    };
    
    hyong f() //返回对象
    {
        hyong m3(5);
        return m3;
    }
    
    int main()
    {
        hyong m(1);
        hyong n = m;  //调用复制构造函数
        cout << m.a << m.b << endl;
        cout << n.a << n.b << endl;
        hyong m1 = hyong(m);  //调用复制构造函数
        cout << m1.a << m1.b << endl;
        hyong m2(m);    //调用复制构造函数
        cout << m2.a << m2.b << endl;
        hyong *p = new hyong(m);  //调用复制构造函数
        cout << p->a << p->b << endl;
        cout << "------------"<< endl;
        hyong m3;
        m3 = hyong(m); //先用复制构造函数得到了一个临时变量,然后用赋值函数将临时变量值赋给m3, 之后临时变量析构
        cout << "------------"<< endl;
        hyong m4;
        m4 = m; //直接调用赋值
        cout << "------------"<< endl;
        hyong m5 = f();    // 设f()返回的临时变量为r,其实r就是函数里的m3,
                           //m3通过复制构造函数赋给m5,之后m3析构
        cout << "------------"<< endl;
        hyong m6;          //先定义,并用默认构造函数初始化了m6
        m6 = f();          //f()返回m3, 然后用复制构造函数将m3赋给了临时变量tmp, m3析构;
                           //tmp通过赋值函数赋给m6, tmp析构
        cout << "------------"<< endl;
        hyong m7(f());     // 设f()返回m3,m3通过复制构造函数赋给m7,之后m3析构
        return 0;
    }

  • 相关阅读:
    C语言I博客作业03
    C语言I—2019秋作业02
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    C语言I博客作业04
    C语言I博客作业02
    C语言I博客作业02
    第一周作业
    C语言I博客作业04
  • 原文地址:https://www.cnblogs.com/dplearning/p/4783626.html
Copyright © 2020-2023  润新知