关于拷贝构造函数(复制构造函数)的问题

不知道为什么,我自己写的拷贝构造函数,

会导致后面的“classA c = a + b;”
 以及“return classA(_number += a._number);”报错。

以下为一个很简单的例子,您可以直接跑一下看看。

#include <iostream>
using namespace std;
class classA
{
public:
 int _number;
 classA(){}
 classA(int number)
 {
  _number = number;
 }
 ~classA(){}
 /*  问题出在我自己写的拷贝构造函数,它会导致后面的“classA c = a + b;”
 以及“return classA(_number += a._number);”报错

 classA(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;
}


Rimas
浏览 1245回答 1
1回答

onemoo

你知道加上 const 就没事了,但你的解释用词不太准确,我不知道你的想法是否正确。我就直接详细说下吧:导致这个问题的原因在 a + b 这个表达式上。operator+ 这个函数返回的是普通的 classA 类型(这样做是对的),但这样的函数返回值——也就是 a + b 表达式的值——算是“右值”。普通的引用——如 classA& 这样的——叫做“左值引用”,它们是不能引用右值对象的。所以 c 并不能用 a + b 的值(右值)作为初值,编译器在这里就报错了。而 const 引用既可以引用左值对象也可以引用右值对象。解决办法自然就是 classA(const classA&),这样的构造函数既能接收普通左值对象,也能接收右值对象,所以就能够编译了。
打开App,查看更多内容
随时随地看视频慕课网APP