C++复数类移除拷贝构造函数const修饰后程序报错,求原因分析
问题原因与解决办法
核心原因
你遇到的错误本质是非const左值引用无法绑定到右值:
- 当
add函数执行return complex(re + c.re, im + c.im);时,complex(...)会创建一个临时对象,临时对象属于右值范畴。 - 你定义的拷贝构造函数
complex(complex &c)参数是非const的左值引用,这种引用只能绑定到可修改的左值(比如命名变量),无法绑定到临时的右值对象。 - 虽然编译器可能会通过返回值优化(RVO)跳过实际的拷贝操作,但C++语法要求必须存在合法的拷贝构造函数来完成逻辑上的拷贝步骤,否则编译直接报错。
解决办法
把拷贝构造函数改回带const修饰的版本即可:
// 类内声明 complex(const complex &c); // 类外实现 complex::complex(const complex &c){ re=c.re; im=c.im; }
const complex &是const左值引用,它既可以绑定到普通左值,也可以绑定到右值(包括临时对象),完全满足返回临时对象时的拷贝需求。
额外说明
- 你之前的误解:返回临时对象时,虽然确实用双参数构造函数创建了对象,但返回过程中语法上需要将这个临时对象拷贝到函数的返回值存储位置,因此必须有能接收该临时对象的拷贝构造函数。
- 若你使用C++11及以上版本,也可以添加移动构造函数
complex(complex &&c),它专门用于处理右值的转移操作,但对于当前场景,恢复const拷贝构造函数是最简单直接的解决方案。
内容的提问来源于stack exchange,提问作者MIKE PAPADAKIS
相关产品推荐
相关产品推荐

