如何在C++中实现构造函数委托的反向调用?
实现反向构造委托的方法
当然可以实现你想要的这种“无参构造先计算参数,再委托带参构造完成初始化”的逻辑!不过你之前的写法确实有问题——直接在无参构造体里调用Foo(bar_figured_out)只会创建一个临时的Foo对象,根本不会初始化当前实例。
C++11的构造函数委托有个关键规则:委托必须在构造函数的初始化列表中完成,而不能在函数体内部。基于这个规则,我们可以通过两种方式实现你的需求:
方法1:用静态辅助函数计算参数
把计算字符串的逻辑抽成一个私有静态函数,在无参构造的初始化列表里调用这个函数获取参数,再委托给带参构造:
#include <string> #include <iostream> class Foo { private: // 静态辅助函数:封装计算bar的逻辑 static std::string calculateBar() { std::string bar_figured_out; // 这里写你的计算逻辑,比如从配置读取、生成随机字符串等 bar_figured_out = "generated_from_no_arg_ctor"; return bar_figured_out; } public: // 无参构造:先调用calculateBar得到参数,再委托带参构造 Foo() : Foo(calculateBar()) { // 如果需要,这里可以写无参构造专属的额外代码 // 注意:这部分代码会在带参构造执行完毕后才运行 std::cout << "无参构造的额外代码执行" << std::endl; } // 带参构造:只负责自身的初始化逻辑 Foo(std::string bar) { // 这里写使用bar初始化类成员的代码 std::cout << "带参构造执行,传入的bar值:" << bar << std::endl; } }; // 测试代码 int main() { Foo f; // 会先执行calculateBar,再执行带参构造,最后执行无参构造的额外代码 return 0; }
方法2:用Lambda表达式直接计算参数
如果不想单独写静态函数,也可以用初始化列表里的Lambda表达式直接完成参数计算,写法更紧凑:
#include <string> #include <iostream> class Foo { public: // 无参构造:用Lambda计算参数,直接委托带参构造 Foo() : Foo([](){ std::string bar_figured_out; // 同样在这里写计算逻辑 bar_figured_out = "lambda_calculated_bar"; return bar_figured_out; }()) { // 无参构造的额外代码(可选) } Foo(std::string bar) { std::cout << "带参构造执行,bar值:" << bar << std::endl; } };
关键说明
- 构造委托的执行顺序:先执行被委托的构造函数(也就是带参构造)的逻辑,再执行当前构造函数(无参构造)体里的代码。如果你的无参构造需要在带参构造之后做一些额外操作,直接写在函数体里就行。
- 辅助函数必须是静态的:因为在构造函数初始化阶段,当前实例还没完全创建,不能调用非静态成员函数,所以计算逻辑要么用静态函数,要么用Lambda这种独立的代码块。
这样就能完美实现你想要的逻辑:无参构造负责计算参数并触发带参构造的初始化,带参构造只处理自身的初始化逻辑。
内容的提问来源于stack exchange,提问作者NeutronStar
相关产品推荐
相关产品推荐

