快捷导航

拷贝构造函数,不加const会报错,为什么?

#include 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

免责声明:本内容仅代表回答者见解不代表本站观点,请谨慎对待。

版权声明:作者保留权利,不代表本站立场。

回复

使用道具 举报

参与会员2

根本原因是,**右值** 不可以绑定到 **非 const 左值引用**

你这里,ClassA a = b + c;
a是左值,b + c 是计算表达式,它是右值。它只可以绑定到 const 左值引用,或者右值引用(或者说通用引用)。
你这里没有形参与之匹配的构造函数。
以下两个都可以:
classA(constclassA&a);//拷贝构造函数classA(classA&&a);//移动构造函数

returnclassA(_number+=a._number);这句也一样,classA(number += a._number) 没有问题,它调用构造函数,但是return,返回的是一个临时变量,临时变量是右值。所以它根本return不出来。定义上面任意一个就可以解决了。
(PS,如果把+重载返回定义为右值引用,return是没有问题了,但是return的右值要拷贝/移动给对象a,又会面临同样的问题)
回复

使用道具 举报

因为你已经声明了一个复制构造函数,所以系统不会产生一个默认的复制构造函数,而你写的复制构造函数括号中是带const的,所以你调用的时候也要带上const,你删掉整个复制构造函数(这样系统就会产生一个默认的复制构造函数)或者你写的复制构造函数中的const就不会报错了,一起学习,一起进步
回复

使用道具 举报

可能感兴趣的问答

发新帖
  • 微信访问
  • 手机APP