不知道为什么,我自己写的拷贝构造函数,会导致后面的“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;}
1 回答
onemoo
TA贡献883条经验 获得超454个赞
你知道加上 const 就没事了,但你的解释用词不太准确,我不知道你的想法是否正确。我就直接详细说下吧:
导致这个问题的原因在 a + b 这个表达式上。
operator+ 这个函数返回的是普通的 classA 类型(这样做是对的),但这样的函数返回值——也就是 a + b 表达式的值——算是“右值”。
普通的引用——如 classA& 这样的——叫做“左值引用”,它们是不能引用右值对象的。所以 c 并不能用 a + b 的值(右值)作为初值,编译器在这里就报错了。
而 const 引用既可以引用左值对象也可以引用右值对象。
解决办法自然就是 classA(const classA&),这样的构造函数既能接收普通左值对象,也能接收右值对象,所以就能够编译了。
- 1 回答
- 0 关注
- 1286 浏览
添加回答
举报
0/150
提交
取消