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

#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会报错,为什么?

https://img2.mukewang.com/5c00be090001bd9003870131.jpg

https://img4.mukewang.com/5c00be0900015f5805290096.jpg


Rimas
浏览 2275回答 2
2回答

AAnonymous

根本原因是,**右值** 不可以绑定到 **非 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,又会面临同样的问题)

阿臣儿

因为你已经声明了一个复制构造函数,所以系统不会产生一个默认的复制构造函数,而你写的复制构造函数括号中是带const的,所以你调用的时候也要带上const,你删掉整个复制构造函数(这样系统就会产生一个默认的复制构造函数)或者你写的复制构造函数中的const就不会报错了,一起学习,一起进步
打开App,查看更多内容
随时随地看视频慕课网APP