为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
Rimas 2018-11-30 12:35:33
#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,又会面临同样的问题)

查看完整回答
反对 回复 2018-12-07
?
阿臣儿

TA贡献2条经验 获得超1个赞

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

查看完整回答
反对 回复 2018-12-04
  • 2 回答
  • 0 关注
  • 2274 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信