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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:24:10