类的成员对象是否仅当类构造函数被调用时才构造?两类实例解析
C++类成员构造时机与初始化方式解析
MyClass 实例 mc 的构造过程
- 类的成员变量
str会在MyClass构造函数体执行之前完成构造,属于mc实例构造流程的一部分,并非等mc完全构造完成后才创建str。 - 这里使用初始化列表
: str(s),本质是直接调用std::string的拷贝构造函数,用传入的参数s直接初始化str,一步完成成员的构造与赋值。
MyClass2 实例 mc2 的构造过程
- 成员变量
str同样在MyClass2构造函数体执行前被构造,但此时是调用std::string的无参默认构造函数,先创建一个空的字符串对象。 - 进入构造函数体后执行
str = s,这是对已经存在的str对象执行拷贝赋值操作(调用std::string的拷贝赋值运算符),属于对已构造成员的二次修改。
核心结论
不管使用初始化列表还是构造函数体内赋值,类的成员变量都会在类实例构造的过程中(构造函数体执行阶段之前)完成构造。两者的核心差异在于:
- 初始化列表:直接用指定参数完成成员的构造,效率更高(避免默认构造+赋值的两步操作)。
- 构造函数体赋值:先默认构造成员,再执行赋值操作,多了一次额外的对象操作。
内容的提问来源于stack exchange,提问作者Engineer999
相关产品推荐
相关产品推荐

