为什么const变量可以修改?

pas*_*uce 4 c++ operator-overloading

我正在编写一本关于运算符重载的示例教科书,它让我想知道返回"常量值"(例如operator+).据我了解,如果我作为a返回任何内容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;
}
Run Code Online (Sandbox Code Playgroud)

之后t3 = t1 + t2,t3现在是一个const Temp对象,而不是一个const Temp&; 然而,它是一个const.我输出它val,然后修改它,虽然我认为我不应该这样做?或者这只属于const Temp&

sco*_*001 7

你说:

t3现在是一个const Temp对象

任务结束后,这就是你的误解所在.

一旦你声明了一个对象,它就永远不会改变类型.

你写Temp t1, t2, t3;那么t3现在是永远是一个非const Temp对象.您将一个const Temp对象(通过引用)传递给它的赋值运算符,运算符用来修改它t3.

为了更好地了解这一点,请查看赋值运算符示例.


编辑:从你似乎认为的一些评论

t3Temp通过使用其构造函数分配了一个新对象?

这让我想到这里也可能存在对构造函数的误解.需要注意的是不论哪种类型的每个对象,一个构造函数被调用该对象只出现一次.这是在第一次声明时发生的.对你而言,当你声明它时,你正在调用它t3默认构造函数Temp t1, t2, t3;.

此外,从运算符返回const值通常不是一个好主意.有关详细信息,请参阅user4581301的链接:按const值返回的目的是什么?

  • 另一个好的资源是[运算符重载的基本规则和习惯用法是什么?](/sf/ask/309519451/ ) (2认同)

归档时间:

查看次数:

224 次

最近记录:

7 年,9 月 前