是否有权威规范推荐类成员用带突变的复杂表达式初始化时采用赋值方式?
类成员初始化风格的权威依据问题
我的同事提出一个编程惯例:当类成员通过复杂表达式或带有状态突变的表达式初始化时,应该采用赋值而非初始化列表的写法。他想知道这种风格有没有权威机构推广?
同事给出的示例是,当初始化表达式复杂或会改变其他状态时,类B的写法更易识别:
// 初始化列表写法 class A { static int counter; int id; A() : id(counter++) { } }; int A::counter = 0; // 构造函数内赋值写法 class B { static int counter; int id; B() { id = counter++; } }; int B::counter = 0;
首先,主流权威C编程规范(如C Core Guidelines、Google C++ Style Guide)普遍优先推荐使用初始化列表,而非构造函数内赋值,核心原因包括:
- 初始化列表直接完成成员初始化,避免非内置类型先默认构造再赋值的额外性能开销;
- 满足const成员、引用成员必须在初始化阶段完成赋值的语法要求;
- 从代码逻辑上明确区分成员初始化动作与构造函数内的业务逻辑,更符合面向对象的初始化语义。
针对你同事提到的“复杂表达式或带状态突变的场景”,主流规范并没有推广赋值写法的相关建议。反而,这类场景更适合通过优化初始化列表的可读性来处理,而非改用赋值:
- 将复杂的初始化逻辑提取为静态辅助函数,让初始化列表的代码更简洁直观;
- 对带有状态突变的操作,添加清晰注释说明其副作用,明确代码意图。
比如可以优化为以下写法:
class C { static int counter; // 封装状态突变的初始化逻辑,添加注释说明 static int generate_id() { return counter++; // 此处会递增全局静态计数器counter } int id; C() : id(generate_id()) { } }; int C::counter = 0;
这种写法既保留了初始化列表的性能和语法优势,又通过封装提升了代码可读性,同时清晰标注了状态变化的逻辑。
内容的提问来源于stack exchange,提问作者Mestkon
相关产品推荐
相关产品推荐

