1. 用已知对象的值来创建一个同类的新对象。
2. 在使用对象作为函数的参数的情况下,当实参值传递给形参时,系统自动调用拷贝构造函数。
3. 当对象作为函数的返回值时,系统自动调用拷贝构造用返回值创建一个临时对象,然后再将这个临时对象赋值给调用函数中的某个接收函数返回值的对象。
在第3点中,当返回值是用来创建一个新对象时,系统不会创建一个临时对象,若是用来赋值给某个已创建的对象时,系统会创建一个临时对象。
#include <iostream>
using namespace std;
class B
{
private:
int data;
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<"--"<<data<<"--"<<this<<endl;
}
B(int i):data(i)
{
cout<<"constructed by parameter"<<"--"<<data<<"--"<<this<<endl;
}
B(const B &b)
{
data = b.data;
cout<<"copy constructor"<<"--"<<data<<"--"<<this<<endl;
}
B& operator=(const B &b)
{
data = b.data;
cout<<"operator="<<"--"<<data<<"--"<<this<<endl;
return *this;
}
};
B Play(B b)
{
return b;
}
int main()
{
B b1(0); //构造b1
B b2(5); //构造b2
//传参调用拷贝构造函数,参数返回调用拷贝构造函数创建临时对象
//释放参数对象,临时对象赋值给b1调用赋值运算符操作,释放临时对象
b1 = Play(b2);
//B b3 = Play(b2); //初始化不会创建临时对象
return 0; //最后释放b2,b1
}