使用拷贝构函数的场合:
1、用一个对象初始化另外一个对象;
2、函数的参数是一个对象,且使用的是值传递方式,则会创建一个临时对象(变量),在调用函数时,会调用拷贝构造函数用实参对象初始化这个临时对象,因而改变的也是这个临时对象。因而函数参数是对象时,通常使用引用传参方式,避免产生临时对象和调用拷贝构造函数,减小程序运行时间和内存资源的开销。
3、函数返回值是一个对象,且是值传递方式。值传递同样也会产生一个临时对象,会调用拷贝构造函数去初始化这个临时对象。
eg:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "constructor" << endl;
}
A(A const& a)
{
cout << "copy constructor" << endl;
}
A &operator = (A const &a)
{
cout << "assignment operator" << endl;
return *this;
}
~A()
{
cout << "destructor" << endl;
}
};
// 一个A类型的对象参数,返回一个A类型对象的值
A test_1(A a)
{
return a;
}
// 一个A类型的对象参数
void test_2(A a)
{
A b = a; //调用拷贝构造函数初始化b,相当于A b(a);
}
void test_3(A a)
{
A b; // 已经调用构造函数初始化对象
b =a ; // b已经初始化,调用赋值运算符
}
int main()
{
A a;
cout << "begin of test_1: " << endl;
test_1(a);
cout << "end of test_1: " << endl << endl;
cout << "begin of test_2: " << endl;
test_2(a);
cout << "end of test_2: " << endl << endl;
cout << "begin of test_3: " << endl;
test_3(a);
cout << "end of test_3: " << endl;
return 0;
}
运行结果:
constructor
begin of test_1:
copy constructor // 产生一个临时对象,调用拷贝构造函数初始化这个临时对象。(产生实参对象的一个副本),
copy constructor // 产生一个临时对象,保存返回值
destructor // 解析临时对象
destructor // 解析临时对象
end of test_1:
begin of test_2:
copy constructor
copy constructor
destructor
destructor
end of test_2:
begin of test_3:
copy constructor
constructor .//调用构造函数初始化对象
assignment operator // 调用赋值运算符
destructor
destructor
end of test_3:
destructor