C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
当你尝试着把拷贝构造函数写成值传递的时候,会发现编译都通不过,错误信息如下:
error: invalid constructor; you probably meant 'S (const S&)' (大致意思是:无效的构造函数,你应该写成。。。)
当编译错误的时候你就开始纠结了,为什么拷贝构造函数一定要使用引用传递呢,我上网查找了许多资料,大家的意思基本上都是说如果用值传递的话可能会产生死循环。编译器可能基于这样的原因不允许出现值传递的拷贝构造函数,也有可能是C++标准是这样规定的。

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

#include
<iostream>
using namespace std;
class S
{
  
int a;
  
public:
  S(
int x):a(x){}
  S(
const S st){this->a=st.a;}//拷贝构造函数
};

int main()
{
    S s1(
2);
    S s2(s1);


    
return 0;
}
当给s2初始化的时候调用了s2的拷贝构造函数,由于是值传递,系统会给形参st重新申请一段空间,然后调用自身的拷贝构造函数把s1的数据成员的值传给st。当调用自身的拷贝构造函数的时候又因为是值传递,所以。。。
也就是说,只要调用拷贝构造函数,就会重新申请一段空间,只要重新申请一段空间,就会调用拷贝构造函数,这样一直下去就形成了一个死循环。
所以拷贝构造函数一定不能是值传递。






Feedback

# re: 关于拷贝(复制)构造函数为什么不能用值传递  回复  更多评论   

2011-11-22 20:09 by SunRise_at
受教了。。。。。。。。。。。。。

# re: 关于拷贝(复制)构造函数为什么不能用值传递  回复  更多评论   

2011-11-26 13:42 by zhenglinbo880531
遇到过这种情况,拷贝构造函数用值传递造成死循环。。

# re: 关于拷贝(复制)构造函数为什么不能用值传递  回复  更多评论   

2016-03-17 19:41 by 奚大坤123
值传递过程有返回值吗

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理