为什么const变量可以修改?

时间:2018-01-23 00:26:09

标签: c++ operator-overloading

我正在编写一本关于运算符重载的示例教科书,它让我想知道通过'常量值'返回(例如使用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&

的对象

1 个答案:

答案 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?