为什么const成员可以初始化两次?

时间:2018-05-03 10:23:37

标签: c++ c++11 initialization const initializer-list

下面是一个代码片段,可以在vs2015中无错误地编译和运行

#include<iostream>
using namespace std;

class A {
    public:
        A(int b) :k(b) {}//second time
    const int k = 666;//first time
};

int main() {
    A a(555);
    cout << a.k << endl;
    return 0;
}

输出为555。但据我所知,const对象应该只初始化一次,之后该值是不可修改的。

2 个答案:

答案 0 :(得分:64)

它没有初始化两次; default member initializer被忽略了。因此,对于A a(555);a.k初始化为555

  

如果成员具有默认成员初始值设定项并且也出现在构造函数的成员初始化列表中,则忽略默认成员初始值设定项。

从标准[class.base.init]/10

开始
  

如果给定的非静态数据成员同时具有默认成员   初始化器和mem-initializer,由初始化器指定   执行mem-initializer,并且非静态数据成员的默认值   成员初始值设定项被忽略。 [例子:给定

struct A {
  int i = /* some integer expression with side effects */ ;
  A(int arg) : i(arg) { }
  // ...
};
     

A(int)构造函数只需将i初始化为arg的值,   并且我的默认成员初始化程序中的副作用不会采取   地点。 - 结束例子]

另一方面,给定

class A {
public:
    A() {}            // k will be initialized via default member initializer, i.e. 666
    A(int b) :k(b) {} // k will be initialized via member initializer list, i.e. b

    const int k = 666;
};

然后对于A a;a.k将初始化为666

答案 1 :(得分:8)

它只被初始化一次。

const int k = 666;
如果没有在构造函数中提供,将使用