有带有默认参数的构造函数时,是否有2次初始化

时间:2018-11-20 15:46:24

标签: c++ constructor initialization

我的问题是关于初始化器的成员数据如何在构造函数中还有一个默认参数的地方进行初始化。

class InputPlay {

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

    private:
        std::string _s = "default";
};

问题

调用构造时,变量 _s 是否要进行两次初始化? aka _s 是否将由字符串文字 default 初始化,然后由构造函数中的默认参数“ test”代替?

3 个答案:

答案 0 :(得分:9)

否,_s仅初始化一次。类内初始化是用于合成成员初始化程序的语法糖。如果您提供自己的成员初始化器,则编译器将使用该初始化器,而不是通过类初始化为您合成一个成员初始化器。

答案 1 :(得分:6)

不。对于non-static data member,当同时提供了默认成员初始化程序和成员初始化程序列表时,默认成员初始化程序将被忽略。这意味着_s将直接由构造函数的参数s初始化。

  

如果成员具有默认的成员初始化程序,并且还出现在构造函数的成员初始化列表中,则默认成员初始化程序将被忽略。

答案 2 :(得分:5)

= "default";默认成员初始化程序。如果您不提供_s,则使用它的初始化程序。但是,因为您确实提供了一个(_s(s),所以默认初始化程序永远不会进入播放器,并且_s只是被初始化为s

来自cppreference.com

  

如果非静态数据成员具有默认成员初始化程序,并且也出现在成员初始化程序列表中,则将执行成员初始化程序列表,并且默认成员初始化程序将被忽略:

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