为何C++类中的const成员变量能够被两次初始化?
为什么const成员变量看起来被“两次初始化”?
嘿,这个问题其实是对C++11引入的非静态数据成员类内初始化特性的误解~ 咱们拆解下你的代码和背后的规则:
先看你的代码片段:
#include<iostream> using namespace std; class A { public: A(int b) :k(b) {}// 这是唯一的初始化动作 const int k = 666;// 这是默认初始化值,并非真正的初始化 }; int main() { A a(555); cout << a.k << endl; return 0; }
你觉得的“两次初始化”其实是个误会,这里的逻辑是:
const int k = 666;是C++11开始支持的类内默认初始化值,它的作用是:当类的构造函数没有在初始化列表里显式初始化k时,才会用这个值完成k的初始化。- 而你的构造函数
A(int b) :k(b) {}里,初始化列表显式指定了用b来初始化k,这时候类内的666就会被直接忽略——k只会被初始化一次,就是用你传入的555完成初始化,所以最终输出是555。
咱们可以做个小测试验证:如果把构造函数改成无参版本,不在初始化列表里处理k:
A() {}
这时候创建A a;,输出的a.k就是666,这也能说明类内的默认值只是备选方案,不是额外的初始化步骤。
总结一下:const成员变量确实只能被初始化一次,你的代码里并没有发生两次初始化——类内的赋值只是提供一个默认的初始化候选值,真正的初始化动作只会执行一次,优先采用构造函数初始化列表里的显式值,没有显式指定时才会用类内的默认值。
内容的提问来源于stack exchange,提问作者choxsword
相关产品推荐
相关产品推荐

