先给出答案:
拷贝构造函数不能用数值或指针形参原因,不是为了节省创建副本的空间与时间。而是那样做会无限循环递归下去。
举个例子来看一下为什么会这样。(反例)
class Example()
{
public:
Example(int a):aa(a) {} //构造函数
Example(Example ex) //拷贝构造函数(值传递参数)
{
aa = ex.aa;
}
private:
int aa;
};
int main()
{
Example e1(10);
Example e2 = e1;
return 0;
}
执行 Example e2 = e1; 时
调用了拷贝构造函数(传值型的)
相当于 e2.Example(e1);
在函数中,因为是值传递所以又需要用e1的值拷贝创建一个副本对象ex,则又需要调用拷贝构造函数ex.Example(e1)
这样就会无限重复下去来完成创建副本ex,无限调用ex.Example(e1)
这就是为什么拷贝构造函数不能使用值传递的形参原因。
正确拷贝构造函数:
Example(const Example &ex)
{
aa = ex.aa;
}
..................................................不能用指针的原因待更............................