gpt4 book ai didi

c++ - 为什么 const 变量是可修改的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:40 25 4
gpt4 key购买 nike

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

最佳答案

你说:

t3 is now a const Temp object

作业完成后,你的误会就在这里

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

您已经编写了 Temp t1, t2, t3; 所以 t3 是并且永远是一个非常量 Temp 对象。您正在将一个 const Temp 对象(通过引用)传递给它的赋值运算符,运算符使用它来修改 t3

为了更好地了解这一点,请查看 assignment operator example .


编辑:从一些评论中您似乎认为

t3 was assigned a new Temp object through use of its constructor?

这让我假设这里也可能存在对构造函数的误解。请注意,无论类型如何,对于每个对象,都会为该对象调用构造函数恰好一次。这发生在它首次声明时。对于您,您正在调用 t3default constructor当您使用 Temp t1, t2, t3; 声明它时。

此外,从您的运算符返回 const 值通常不是一个好主意。有关更多信息,请参见 user4581301 的链接:Purpose of returning by const value?

关于c++ - 为什么 const 变量是可修改的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com