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

如何在类构造函数中使用类内声明的const常量?

类构造函数中使用类常量值的正确方式

你想要让无参构造函数通过委托调用带参构造函数,并传入类的默认常量值,但当前写法会导致传入的参数是未初始化的垃圾值。

错误代码示例:

class Foo{
    public:
    Foo() : Foo(DEFAULT) {};
    Foo(int num) : DEFAULT(4) { /*do something with num */};
    const int DEFAULT;
};

即使调整成员声明顺序,问题依然存在:

class Foo{
    public:
    const int DEFAULT;
    Foo(int num) : DEFAULT(4) { /*do something with num */};
    Foo() : Foo(DEFAULT) {};
};

问题原因

C++中使用委托构造时,被委托的构造函数负责所有成员变量的初始化,且成员的初始化顺序严格按照类中声明的顺序执行。你的写法里,DEFAULT是对象的成员常量,在无参构造委托带参构造时,DEFAULT还未被初始化,此时传入的DEFAULT是未定义的垃圾值;而带参构造初始化DEFAULT为4的操作,是在参数传递完成之后才执行的,因此num已经是无效值了。

解决方案

方案1:使用类静态常量(C++98及以上)

将DEFAULT定义为类的静态成员,它属于类本身,会在任何对象构造前完成初始化,这样委托构造时就能直接使用已初始化的常量值:

class Foo{
public:
    static const int DEFAULT;
    Foo() : Foo(DEFAULT) {};
    Foo(int num) { 
        // 可以正常使用num和DEFAULT
    };
};

// 类外初始化静态常量
const int Foo::DEFAULT = 4;

方案2:使用inline静态常量(C++11及以上)

C++11支持inline静态成员,无需在类外单独定义,写法更简洁:

class Foo{
public:
    inline static const int DEFAULT = 4;
    Foo() : Foo(DEFAULT) {};
    Foo(int num) { 
        // 可以正常使用num和DEFAULT
    };
};

方案3:直接传入字面量(简单场景备选)

如果不想使用静态成员,可以在无参构造中直接传入默认值字面量,同时在带参构造中初始化DEFAULT。缺点是默认值需要写两次,维护性稍差:

class Foo{
public:
    const int DEFAULT;
    Foo() : Foo(4) {};
    Foo(int num) : DEFAULT(4) { 
        // 使用num做操作
    };
};

内容的提问来源于stack exchange,提问作者Matan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:55:25