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

big*_*iao 39 c++ initialization const initializer-list c++11

下面是一个代码片段,可以在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;
}
Run Code Online (Sandbox Code Playgroud)

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

son*_*yao 64

它没有初始化两次; 该默认成员初始只是忽略.因此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) { }
  // ...
};
Run Code Online (Sandbox Code Playgroud)

A(int)构造函数将简单地将i初始化为arg的值,并且不会发生i的默认成员初始值设定项中的副作用. - 结束例子]

另一方面,给定

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;
};
Run Code Online (Sandbox Code Playgroud)

那么A a;,a.k将被初始化为666.

  • 这句话出自哪里?我不是在争论它 - 正确引用它会很好。 (2认同)

Jar*_*d42 8

它只初始化一次.

const int k = 666;
Run Code Online (Sandbox Code Playgroud)

如果没有在构造函数中提供,将使用它.