gpt4 book ai didi

c++ - 为什么声明为类成员的 const 变量仍然可以修改?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:05 25 4
gpt4 key购买 nike

如果一个已经被赋值的const变量仍然可以被重新赋值,那么它不是一个const?举个例子:

 struct ss
{
const int m = 1024;

ss()
{
}

ss(int m) : m(m)
{
}
};



ss sa;
ss sb(-1);

cout << sa.m << endl;
cout << sb.m << endl;

哇 m 毕竟不是常数!

> /* Ouput:
>
> 1024
> -1
>
> */

最佳答案

 ss(int m) : m(m)
{
}

这表示当类 ss 被初始化时,它的成员 m 使用参数 m 被初始化。成员 m 确实不能修改,但可以初始化,就像任何其他 const 对象一样。请注意,如果我们改为这样做

 ss(int m)
{
this->m = m;
}

那么我们就会遇到问题,因为 ss::m 需要初始化。如果 ss::m 是一个带有默认构造函数的类,那么在

 ss(FooClass m)
{
this->m = m;
}

不显式初始化 ss::m 是可以的(因为它只是默认构造的),但是构造函数主体中的行将被拒绝,因为它会修改 ss::m 在它已经被初始化之后。

编辑:糟糕,我不明白你原来的问题。

brace-or-equal-initializer 例如

const int m = 1024;

仅在 ctor-initializer 中未提及成员时使用。换句话说,由于默认构造函数没有显式初始化 m,因此使用值 1024。但是 ss::ss(int) 确实显式初始化了 m,所以 brace-or-equal-initializer 被忽略了。

关于c++ - 为什么声明为类成员的 const 变量仍然可以修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24226054/

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