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

C++11类成员初始化相关问题:默认构造函数与构造行为

C++类成员初始化相关问题

以下是一个类的简短示例,其中变量myInteger未在已定义的唯一构造函数中初始化。

// A.h

class A
{
    public:
        
    A(const std::string& str);

    private:

    int myInteger;
};


// A.cpp

A::A(const string& str)
{
    // 我对str执行一些操作
}

由于已定义了一个构造函数,编译器不会生成无参默认构造函数。

问题1

若修改头文件为变量myInteger设置初始值,编译器是否会生成新的默认构造函数?

修改后的头文件:

// A.h

class A
{
    public:
        
    A(const std::string& str);

    private:

    int myInteger = 3;
};

问题2

若修改头文件为变量myInteger设置初始值,编译器是否会修改上述已定义构造函数的行为,使其等同于以下实现?

A::A(const string& str)
    : myInteger{3}
{
    // 我对str执行一些操作
}

我查阅了《Effective Modern C++》但未找到相关答案,这是一个较为特殊的问题。


问题1解答

不会。编译器生成无参默认构造函数的核心规则是:仅当类中没有任何用户声明的构造函数时才会自动生成。即便给非静态成员变量添加了类内初始值,只要类中存在用户自定义的构造函数(比如这里的A(const std::string& str)),编译器就不会再生成默认构造函数,类内初始值的存在不会改变这一规则。

问题2解答

是的。根据C++11及后续标准,类内成员初始值会作为该成员的默认初始化值——如果构造函数的成员初始化列表中没有显式初始化这个成员,编译器会自动将类内初始值插入到初始化列表中,最终效果完全等同于手动在初始化列表中写myInteger{3}。

需要注意:如果构造函数的成员初始化列表中显式指定了myInteger的初始化值,那么类内初始值会被直接忽略,以初始化列表中的值为准。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:06:25