拷贝复制构造函数为什么不能用值传递

  转载自http://goo.gl/dpNgw

  当你尝试着把拷贝构造函数写成值传递的时候,会发现编译都通不过,错误信息如下:
error: invalid constructor; you probably meant 'S (const S&)' 。

  当编译错误的时候你就开始纠结了,为什么拷贝构造函数一定要使用引用传递呢,我上网查找了许多资料,大家的意思基本上都是说如果用值传递的话可能会产生死循环。编译器可能基于这样的原因不允许出现值传递的拷贝构造函数,也有可能是C++标准是这样规定的。

  如果真是产生死循环这个原因的话,应该是这样子的:

01 #include <iostream>
02 using namespace std;
03
04 class S
05 {
06     int a;
07     public:
08     S(int x):a(x){}
09     S(const S st) { this->a=st.a; }  //拷贝构造函数
10 };
11
12 int main()
13 {
14     S s1(2);
15     S s2(s1);
16
17     return 0;
18 }

  当给s2初始化的时候调用了s2的拷贝构造函数,由于是值传递,系统会给形参st重新申请一段空间,然后调用自身的拷贝构造函数把s1的数据成员的值传给st。当调用自身的拷贝构造函数的时候又因为是值传递,所以。。。

  也就是说,只要调用拷贝构造函数,就会重新申请一段空间,只要重新申请一段空间,就会调用拷贝构造函数,这样一直下去就形成了一个死循环。

  所以拷贝构造函数一定不能是值传递。

拷贝复制构造函数为什么不能用值传递》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注