复制构造函数的参数能否采用值传递

今天看到这么一个面试题:请分析下面代码的编译运行结果,并提供三个选项:A 编译错误  B 编译成功,运行是崩溃 C 编译运行正常,输出10

class aa
{
private:
	int value;
public:
	aa(int n) { value = n; }
	aa(aa other) { value = other.value; }
	void print() { cout << value << endl; }
};

int main()
{
	aa val_1 = 10;
	aa val_2 = val_1;
	val_2.print();
	return 0;
}


粗一看,好像没什么问题,我在vc6.0上测试了下,发现编译不过,显示复制构造函数非法,当时很不明白,细想了一下,发现问题出在传递的这个参数other上。复制构造函数作用时,因为other是值传递,所以会生成实参的副本,生成副本的过程就又会调用复制构造函数,这就是对自身的调用,就会导致对自身的无限调用,从而导致栈溢出。正确的做法将参数改成  const aa & other.

细节决定成败啊

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值