基本成员初始化vs在类声明中指定默认值

时间:2013-11-28 16:42:04

标签: c++ class object initialization member

我正在阅读C ++中的基础/成员初始化,我真的不明白发生了什么。请考虑以下示例Date类:

// CLASS DECLARATION
class Date
{
    private:
        int month;
        int day;
        int year;
    public:
        Date(int = 7, int = 4, int = 2012);     // CONSTRUCTOR
        Date(const Date&);                      // COPY CONSTRUCTOR
        void showDate();        // MEMBER FUNCTION TO DISPLAY DATE
};

可以通过以下方式创建Date对象:Date a;,将a的成员变量分配给7/4/2012。现在进行基本成员初始化有什么不同,如下所示:

// class declaration section
public:
    Date(int mo=7, int da=4, int yr=2012):month(mo), day(da), year(yr) {}

相当于:

// class declaration section
public:
  Date(int = 7, int = 4, int = 2012);  // prototype with defaults
// class implementation section
Date::Date(int mo, int da, int yr) : month(mo), day(da), year(yr) {}

有人可以解释两种情况之间的差异吗?有什么区别,你为什么要做第二种情况?它只是在构造函数中初始化默认值的另一种方法还是更多?谢谢。

3 个答案:

答案 0 :(得分:1)

基本上没有区别。在第一种情况下,您将在一个步骤中声明和定义构造函数(因此{}括号)。在第二种情况下,您首先声明构造函数,然后定义/实现它。但初始化列表只能在定义中,而不是声明。

答案 1 :(得分:1)

只要未明确传递参数,就会替换默认参数。这意味着可以通过编写void f(int a = 5)来调用f(),这相当于f(5)。但您也可以显式传入不同的值,例如f(3)

但是,您的示例中的两个片段并不是真正等效,因为构造函数Date(int mo=7, int da=4, int yr=2012)也可以使用Date(5)调用,这相当于Date(5, 4, 2012)

编辑:哦对不起,您明确要求实施方面的差异。默认参数仅在声明中使用,因为默认值必须在调用站点传递,其中实现可能不可见(即,如果在另一个翻译单元/ .cpp文件中定义)。

答案 2 :(得分:1)

我看到唯一的区别是默认情况下内联函数包括在类定义中定义的构造函数。 第二种情况允许您分隔声明和定义。