当存在具有默认参数的构造函数时,是否有2次初始化

SLN*_*SLN 7 c++ constructor initialization

我的问题是如何初始化具有初始化程序的成员数据,其中构造函数中还有一个默认参数.

class InputPlay {

    public:
        InputPlay(std::string s = "test" ) : _s(s) {  };

    private:
        std::string _s = "default";
};
Run Code Online (Sandbox Code Playgroud)

问题:

调用构造时,变量_s是否会有2次初始化?又名_s将由字符串文字默认初始化,然后由构造函数中的默认参数"test"替换?

Nat*_*ica 9

不,_s只会初始化一次.类内初始化是用于合成成员初始化器的语法糖.如果您提供自己的成员初始化程序,那么编译器将使用它而不是从类初始化中为您合成一个.


son*_*yao 6

对于非静态数据成员,当提供默认成员初始值设定项和成员初始值设定项列表时,将忽略默认成员初始值设定项.这意味着_s将直接由s构造函数的参数初始化.

如果成员具有默认成员初始值设定项并且也出现在构造函数的成员初始化列表中,则忽略默认成员初始值设定项.


Fra*_*eux 5

= "default";默认成员初始值设定项._s如果您不提供初始化程序,它就是初始化程序.但是由于你确实提供了一个(_s(s)),默认的初始化器永远不会进入播放器并且_s只是初始化为s.

来自cppreference.com:

如果非静态数据成员具有默认成员初始值设定项并且也出现在成员初始值设定项列表中,则会执行成员初始值设定项列表并忽略默认成员初始值设定项:

请注意,根据定义,某些内容只能初始化一次.如果它看起来像初始化两次,它通常被初始化然后分配另一个值.