当前位置:  开发笔记 > 编程语言 > 正文

为什么我能在构造函数中初始化const?

如何解决《为什么我能在构造函数中初始化const?》经验,为你挑选了1个好方法。

正如标题所暗示的那样,我一直认为要设置常量值并且无法修改但是我注意到你能够在构造函数中更改它.正如您所看到的,我创建了一个字符串名称,稍后将其设置为我通过构造函数的任何内容,为什么这允许?

示例代码:

#include 
using 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值可以在运行时设置.例如:

#include 

int 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如果您修改原始变量(不仅仅是引用),则会调用未定义的行为.值得庆幸的是,你必须尽力做到这一点,所以如果你这样做可能不是偶然的.



1> Cornstalks..:

你没有改变const string.你正在初始化它.

const表示一旦变量初始化,就无法更改.它并不意味着constexpr(这意味着编译时常量表达式).

const值可以在运行时设置.例如:

#include 

int 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如果您修改原始变量(不仅仅是引用),则会调用未定义的行为.值得庆幸的是,你必须尽力做到这一点,所以如果你这样做可能不是偶然的.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有