正如标题所暗示的那样,我一直认为要设置常量值并且无法修改但是我注意到你能够在构造函数中更改它.正如您所看到的,我创建了一个字符串名称,稍后将其设置为我通过构造函数的任何内容,为什么这允许?
示例代码:
#includeusing namespace std; class test{ const string name; public: test(const string &nam) : name(nam) {} string get_name() { return name; } }; int main () { test a("Tom"); cout << a.get_name(); // const string t1; // string t2 = "changing"; this causes an error // t1 = &t2; return 0; }
Cornstalks.. 7
你没有改变const string
.你正在初始化它.
const
表示一旦变量初始化,就无法更改.它并不意味着constexpr
(这意味着编译时常量表达式).
const
值可以在运行时设置.例如:
#includeint main() { int x; std::cin >> x; const int y = x; // This is totally fine. std::cout << "You entered the number " << y; }
在上面的示例中,值y
是在运行时确定的(在读取值之后x
).它用值x
初始化,在初始化之后,我们无法改变它的值.*
与const
会员完全相同.
更改变量意味着它存在,具有值,然后将其设置为新值.情况并非如此.在调用构造函数之前,变量/成员不存在.由于它不存在,因此不可能具有某些先前的值.相反,你正在创建变量/成员并同时给它(第一个和唯一的)值(这是我们谈论初始化时的意思).这个过程没有变化.
*const_cast
让我们将const
引用的值更改为最初不是的变量const
.因此存在变通方法.但是,const
如果您修改原始变量(不仅仅是引用),则会调用未定义的行为.值得庆幸的是,你必须尽力做到这一点,所以如果你这样做可能不是偶然的.
你没有改变const string
.你正在初始化它.
const
表示一旦变量初始化,就无法更改.它并不意味着constexpr
(这意味着编译时常量表达式).
const
值可以在运行时设置.例如:
#includeint main() { int x; std::cin >> x; const int y = x; // This is totally fine. std::cout << "You entered the number " << y; }
在上面的示例中,值y
是在运行时确定的(在读取值之后x
).它用值x
初始化,在初始化之后,我们无法改变它的值.*
与const
会员完全相同.
更改变量意味着它存在,具有值,然后将其设置为新值.情况并非如此.在调用构造函数之前,变量/成员不存在.由于它不存在,因此不可能具有某些先前的值.相反,你正在创建变量/成员并同时给它(第一个和唯一的)值(这是我们谈论初始化时的意思).这个过程没有变化.
*const_cast
让我们将const
引用的值更改为最初不是的变量const
.因此存在变通方法.但是,const
如果您修改原始变量(不仅仅是引用),则会调用未定义的行为.值得庆幸的是,你必须尽力做到这一点,所以如果你这样做可能不是偶然的.