#include <iostream>
using namespace std;
class classA
{
public:
int _number;
classA(){}
classA(int number)
{
_number = number;
}
~classA(){}
/* 问题出在我自己写的拷贝构造函数,不加“const”会导致后面的“classA c = a + b;”
以及“return classA(_number += a._number);”报错*/ classA(const classA &a) { _number = a._number; } classA operator+(classA &a) { return classA(_number += a._number); }};int main(){ classA a(1),b(2); classA c = a + b; cout << c._number << endl; return 0;}源代码如上所示,加了const不会报错,不加const会报错,为什么?
2 回答
AAnonymous
TA贡献62条经验 获得超31个赞
根本原因是,**右值** 不可以绑定到 **非 const 左值引用**
你这里,ClassA a = b + c;
a是左值,b + c 是计算表达式,它是右值。它只可以绑定到 const 左值引用,或者右值引用(或者说通用引用)。
你这里没有形参与之匹配的构造函数。
以下两个都可以:
classA(const classA &a); // 拷贝构造函数 classA(classA &&a); // 移动构造函数
return classA(_number += a._number);
这句也一样,classA(number += a._number) 没有问题,它调用构造函数,但是return,返回的是一个临时变量,临时变量是右值。所以它根本return不出来。定义上面任意一个就可以解决了。
(PS,如果把+重载返回定义为右值引用,return是没有问题了,但是return的右值要拷贝/移动给对象a,又会面临同样的问题)
阿臣儿
TA贡献2条经验 获得超1个赞
因为你已经声明了一个复制构造函数,所以系统不会产生一个默认的复制构造函数,而你写的复制构造函数括号中是带const的,所以你调用的时候也要带上const,你删掉整个复制构造函数(这样系统就会产生一个默认的复制构造函数)或者你写的复制构造函数中的const就不会报错了,一起学习,一起进步
- 2 回答
- 0 关注
- 2274 浏览
添加回答
举报
0/150
提交
取消