我正在编写一本关于运算符重载的示例教科书,它让我想知道通过'常量值'返回(例如使用operator+
)。据我所知,如果我以const
的形式返回任何内容,则以后无法修改。说我有这个粗略的例子:
#include <iostream>
using namespace std;
class Temp {
private:
int val;
public:
Temp(){};
Temp(int v):val(v){};
const Temp operator+(const Temp& rhs) const {
return Temp(this->val + rhs.val);
}
int getVal() { return this->val; }
void setVal(int v) { this->val = v; }
};
int main() {
Temp t1, t2, t3;
t1 = Temp(4);
t2 = Temp(5);
t3 = t1 + t2;
cout << t3.getVal() << endl;
t3.setVal(100);
cout << t3.getVal() << endl;
}
在t3 = t1 + t2
之后,t3
现在是const Temp
个对象,而不是const Temp&
;然而,它是const
。我输出它的val
,然后修改它,虽然我以为我不应该这样做?或者这只属于const Temp&
?
答案 0 :(得分:7)
你说:
t3
现在是const Temp
对象
在完成作业后,这就是你误解的地方。
一旦您宣布了某个对象,就永远不会从不更改类型。
您已撰写Temp t1, t2, t3;
,因此t3
始终是非常量Temp
对象。您将const Temp
对象(通过引用)传递给其赋值运算符,运算符用它来修改t3
。
为了更好地了解这一点,请查看assignment operator example。
编辑:您似乎认为
中的一些评论是否通过使用构造函数为
t3
分配了一个新的Temp
对象?
这让我想到这里也可能存在对构造函数的误解。请注意,对于每个对象而言,无论何种类型,都会为该对象完全一次调用构造函数。这是在首次申报时发生的。对您而言,当您使用t3
声明Temp t1, t2, t3;
default constructor时,请致电{{1}} {/ 3}}。
此外,从运算符返回const值通常不是一个好主意。有关详情,请参阅user4581301的链接:Purpose of returning by const value?