You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构造函数参数初始化列表与构造函数内赋值运算符是否存在差异?

构造函数初始化列表 vs 构造函数内部赋值:差异全解析

嘿,这两种写法可不是换个地方写代码那么简单,实际行为和适用场景差不少呢!我给你拆解清楚:

1. 初始化时机完全不同

  • 初始化列表:在对象刚被创建的那一刻,直接对成员变量进行初始化——相当于调用成员的构造函数(比如string name{name}是直接调用string的拷贝构造函数),一步到位。
  • 构造函数内部赋值:先给成员变量做默认初始化(比如string会默认生成一个空字符串,int会是未定义值),之后再通过赋值运算符把参数值“覆盖”上去,相当于多了一步操作。

看你的代码例子,两种写法的底层逻辑对比:

// 初始化列表写法:直接初始化成员
Person1::Person1(int age, string name, double weight, double height)
: age{age}, name{name}, weight{weight}, height{height}
{}

// 内部赋值写法:先默认初始化,再赋值
Person1::Person1(int age, string name, double weight, double height)
{
    this->age = age;       // int先默认初始化(值随机),再赋值
    this->name = name;     // string先默认构造空串,再调用赋值运算符
    this->weight = weight;
    this->height = height;
}

2. 对const/引用成员的语法限制

如果你的类里有const修饰的成员,或者引用类型的成员,只能用初始化列表,构造函数内部赋值是完全行不通的:

class Person2 {
public:
    const int id;       // const成员必须初始化
    string& nickname;   // 引用必须在创建时绑定对象

    // 必须用初始化列表,否则编译报错
    Person2(int id, string& nickname) : id{id}, nickname{nickname} {}
};

这是因为const成员一旦创建就不能被修改,引用必须在声明时就绑定目标,构造函数内部已经是对象创建后的阶段了,根本没机会完成这些操作。

3. 效率差异(针对自定义类型)

对于像string、自定义类对象这类非内置类型,初始化列表的效率更高:

  • 初始化列表只需要调用一次拷贝/移动构造函数;
  • 内部赋值则需要先调用一次默认构造函数,再调用一次赋值运算符,相当于多了一次对象构造的开销。

不过对于int、double这类内置类型,编译器通常会把内部赋值优化得和初始化列表差不多,但为了代码风格统一和避免潜在问题,还是推荐优先用初始化列表。

总结

除非有特殊需求,否则尽量优先使用初始化列表——它不仅更高效,还能处理const/引用这类特殊成员,代码也更简洁规范。

内容的提问来源于stack exchange,提问作者rn4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:04:28