如何在类/结构体中初始化其他类/结构体类型成员?含具体场景问询
在C++中初始化类/结构体中的类/结构体成员
当然可以实现你的需求!在C++里,要初始化类或结构体中的另一个类/结构体类型成员,最推荐也最正确的方式是使用成员初始化列表——这不仅效率更高,也是处理没有默认构造函数的成员类型的必需手段。
针对你给出的代码示例,我们来具体实现:
首先看你的原始定义(我帮你补上了语法遗漏的分号):
struct foo { int n; foo(const int s) {n = s;} }; struct wrapper { foo f; wrapper(const int s); };
因为你给foo定义了带参数的构造函数,编译器不会为它自动生成默认构造函数。这意味着如果不在wrapper的构造函数里显式初始化f,编译器会尝试调用foo的默认构造函数,直接导致编译错误。
正确的做法是在wrapper的构造函数定义中使用成员初始化列表,直接调用foo的构造函数来初始化f:
// wrapper构造函数的定义 wrapper(const int s) : f(s) {}
代码解释
: f(s)就是成员初始化列表的部分,它位于构造函数参数列表之后、函数体之前。- 这里的
f(s)会在wrapper的构造函数体执行之前,直接调用foo的构造函数foo(const int s),把参数s传递进去,完成f成员的初始化。 - 如果尝试在构造函数体内写
f = foo(s);,这本质是先默认构造f(但foo没有默认构造函数,编译失败),再进行赋值操作,既低效又不可行。
拓展:多个成员的初始化
如果wrapper有多个需要初始化的成员,比如再加一个int类型的成员m,可以用逗号分隔多个初始化项:
struct wrapper { foo f; int m; wrapper(const int s, int m_val); }; wrapper(const int s, int m_val) : f(s), m(m_val) {}
这种方式能确保所有成员都在构造函数体执行前完成初始化,是C++中初始化成员的最佳实践。
内容的提问来源于stack exchange,提问作者Ziqi Fan
相关产品推荐
相关产品推荐

