为什么复制构造函数的形参必须设置为引用类型?

maplesx 2007-01-04 03:29:38
为什么复制构造函数的形参必须设置为引用类型?
如:
demo::demo(const demo &object)
{
}

demo::demo(const demo object)
{
}
就无法工作呢?
...全文
929 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jikeyuan1 2010-10-14
  • 打赏
  • 举报
回复
其实这个问题我也不太懂 谢啦 学到了 嘿嘿
OOPhaisky 2007-01-10
  • 打赏
  • 举报
回复
这个已经是老问题了,我就至少看见过n次了。

------------------------------------------------------------------------------------
如果不是引用,
那么参数本身需要 复制 一个对象,
该对象的复制 需要调用 拷贝构造,
拷贝构造的参数又是一个对象, 又是调用拷贝构造 ....

死循环 。。。

------------------------------------------------------------------------------------
正解。
DragonBill 2007-01-09
  • 打赏
  • 举报
回复
只有死循环一个原因吗?不对吧
wowRicky 2007-01-09
  • 打赏
  • 举报
回复
已经很清楚了,
值传递要调用拷贝构造函数,,原函数本身就是一个拷贝构造函数,无穷递归
htqx 2007-01-09
  • 打赏
  • 举报
回复

是一个逻辑错误.

参数传递是值传递的,而非引用传递, 就是要拷贝一次.
拷贝需要调用拷贝函数.
而拷贝函数又需要值传递,又要拷贝一次.

这样不断循环,直到内存溢出.

因而,拷贝函数应该采用不产生拷贝操作的引用形参.

demo::demo(const demo &object)
{
}
xusheng_fenglin 2007-01-09
  • 打赏
  • 举报
回复
曾经我也想问这个问题,我那时候看的是钱能的书,这个原因没有写,后来看了本老外的书知道了,

如果不传引用而传值的话,编译器会报告内存溢出,
原因是: 如果参数用值来传递,就需要创建该值的一个副本,如何创建副本呢??使用拷贝构造函数,但是原函数本身就是一个拷贝构造函数,所以它调用的是它自己,于是,形成递归调用,导致耗尽所有的内存
如果传的是引用,这样就可以不要建立副本了.....

看来我比楼主快一点点...我学到后面去了,呵呵!!一起加油!!
jixingzhong 2007-01-05
  • 打赏
  • 举报
回复
如果不是引用,
那么参数本身需要 复制 一个对象,
该对象的复制 需要调用 拷贝构造,
拷贝构造的参数又是一个对象, 又是调用拷贝构造 ....

死循环 。。。
ShardowM 2007-01-05
  • 打赏
  • 举报
回复
哦,原来如此,呵呵,学习
mahongwei888 2007-01-05
  • 打赏
  • 举报
回复
各位大哥:
帮个忙,小弟有个问题是关于SPI拦截网络封包技术的,我现在已经拦截到了数据包,放到了文件中,但不知道如何过滤数据包了,我是用c++写的!请各位专家指点!!!非常感谢!!留个联系方式也好啊,象qq什么的?
kenneth_lueng 2007-01-04
  • 打赏
  • 举报
回复
sinall() ( ) 信誉:94 Blog 2007-01-04 16:17:19 得分: 0

哦,我要是认为demo::demo(const demo object)是构造函数而非拷贝构造函数呢?

=====================================

哦!!!
这构造和拷贝构造是可以随便认为的吗?
这种形式不是已经默认为拷贝构造了吗?
sinall 2007-01-04
  • 打赏
  • 举报
回复
哦,我要是认为demo::demo(const demo object)是构造函数而非拷贝构造函数呢?
w_anthony 2007-01-04
  • 打赏
  • 举报
回复
首先你要明白普通的函数,像这样的demo::fun(const demo object),如果参数不是引用,是会默认调用一次拷贝构造函数的。

所以如果有一个函数demo::demo(const demo object),在参数传递的时候要调用拷贝构造函数也就是自己,调用自己的时候又是一次参数传递,所以又要调用一次自己,调用自己的时候又是一次参数传递,所以又要调用一次自己,……以下省略无限多字

从前有座山……
晨星 2007-01-04
  • 打赏
  • 举报
回复
如果是值参数传递,需要调用拷贝构造函数来完成参数传递。
而你现在又恰恰是在定义拷贝构造函数本身。。。。
casale 2007-01-04
  • 打赏
  • 举报
回复
因为传值的话会拷贝所传的对像的副本,副本用什么拷贝产生,拷贝构造函数啊,所以就.....
zhousqy 2007-01-04
  • 打赏
  • 举报
回复
因爲參數是值傳遞
redleaves 2007-01-04
  • 打赏
  • 举报
回复
因为常引用不产生副作用.看起来又直接
v2002750 2007-01-04
  • 打赏
  • 举报
回复
因为以一个对象为参数的时候会调用拷贝构造函数,如果拷贝构造函数以对象为参数,它就会调用自身。
kenneth_lueng 2007-01-04
  • 打赏
  • 举报
回复
引用保证你传进来的是一个对象
v2002750 2007-01-04
  • 打赏
  • 举报
回复
无穷递归
maplesx 2007-01-04
  • 打赏
  • 举报
回复
你说的我还是不明白
加载更多回复(3)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧