C++17及以上版本能否在构造函数体内调用其他构造函数?
结论
你示例中在构造函数体内直接写Foo::Foo(items)调用其他构造函数的写法在所有C标准(包括C17及更高版本)中都不可行。
问题原因
该写法并不会在当前正在构造的Foo对象上执行目标构造函数的逻辑,只会创建一个临时的Foo匿名对象,该对象在当前语句执行结束后就会被立即销毁,对当前对象的初始化没有任何作用,属于无意义代码。
可行的替代方案
如果你的场景需要在调用其他构造函数前先做复杂预处理,有两种常用实现方式:
方案1:公共初始化逻辑抽离(全版本兼容)
将两个构造函数共用的初始化逻辑抽为私有成员函数,两个构造函数各自完成自身专属预处理后,调用该公共函数即可:
class Foo { private: void init(const vector<item>& items) { // 原来Foo(vector<item>)构造函数里的初始化逻辑 } public: Foo(vector<item> items) { init(items); } Foo(char* buf, size_t num) { // 解包buf得到items的逻辑 init(items); } };
方案2:委托构造+静态预处理函数(C++11及以上支持)
如果你希望直接复用已有的构造函数,可以将预处理逻辑封装为静态成员函数,在初始化列表的委托构造参数中调用即可:
class Foo { private: // 封装buf解包逻辑为静态函数,可直接在初始化列表中调用 static vector<item> unpack_buffer(char* buf, size_t num) { // 解包逻辑,返回生成的vector<item> } public: Foo(vector<item> items) { // 原有初始化逻辑 } Foo(char* buf, size_t num) : Foo(unpack_buffer(buf, num)) { // 委托构造完成后,可在此补充其他初始化逻辑 } };
内容的提问来源于stack exchange,提问作者user491880
相关产品推荐
相关产品推荐

