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

时间:2016-01-02 19:16:01

标签: c++

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

示例代码:

#include <iostream>
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;
}

1 个答案:

答案 0 :(得分:7)

您没有更改const string。你正在初始化它。

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

可以在运行时设置

const个值。例如:

#include <iostream>

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,则在修改它时将调用未定义的行为。值得庆幸的是,你必须尽力做到这一点,所以如果你这样做可能不是偶然的。