参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题)
用到复制构造函数的情况:
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; }