copy构造函数是一个极其重要的函数,因为它定义一个对象如何通过pass-by-value(以值传递)。举个例子,考虑以下代码:
bool hasAcceptableQuality(Widget w);
...
Widget aWidget;
if(hasAcceptableQuality(aWidget))...
参数w是以by-value方式传递给hasAcceptableQuality,所以在上述调用中,aWidget被复制到w体内,这个动作由类Widget的copy构造函数完成。pass-by-value意味着调用copy构造函数。
关于copy构造函数本身的定义有一个必须注意的地方就是参数要定定义为引用传参。
class Widget{ Widget(); //default构造函数 Widget(const Widget& rhs) //copy构造函数 ... }
在面试中经常会遇到这样一类题型。分析以下程序的编译和运行结果:
#include <iostream>
using namespace std;
class Person
{
private:
int age;
public:
Person(int n){age=n;}
Person(Person per){age=per.age;}
void print(){cout<<age<<endl;}
};
int main()
{
Person a=10;
Person b=a;
b.print();
return 0;
}
答案是编译错误。在上述代码中 Person b=a,调用了copy构造函数。然而在类定义体中,copy构造函数Person(Person per)传入的参数是Person的一个实例。由于是传值参数就会调用copy构造函数。因此如果允许copy构造函数传值,就会造成在copy构造函数中调用copy构造函数,形成无休止的递归导致栈溢出。因此C++的标准不允许copy构造函数传值,在Visiual Studio和GCC编译器中都将出错。