#include <iostream>
using namespace std;
class A{
public:
A(){
cout<<"default construct"<<endl;
}
~A(){
cout<<"destructed"<<endl;
}
A(int i):m_data(i){
cout<<"constructed by parameter" << m_data <<endl;
}
A(const A &a){
cout<< "copy constructor" <<endl;
m_data = a.m_data;
}
A& operator =(const A &a){
cout<<"copy assignment operator"<<endl;
if(this==&a){
return *this;
}
this->m_data = a.m_data;
return *this;
}
private:
int m_data;
};
A function(A a){
return a;
}
int main(int argc, char *argv[])
{
A a1 = function(10);
cout << "----------------------" << endl;
A a2 = function(a1);
cout << "----------------------" << endl;
A a3;
a3 = a2;
cout << "----------------------" << endl;
return 0;
}
为什么要用引用?
【错误答案】个人第一反应:为了减少一次内存拷贝。
【正确答案】在执行function(a1)时,其实会调用拷贝构造函数在函数内创建一个临时对象。如果我们的拷贝构造函数的参数不是引用,那么拷贝构造函数又会重复调用拷贝构造函数,就这样永远的递归调用下去了。
所以, 拷贝构造函数是必须要带引用类型的参数的, 而且这也是编译器强制性要求的。
为什么要用const?
【正确答案】加上const,防止对引用类型参数值的意外修改。