【问题标题】:Base Member Initialization vs Assigning default value in class declaration基成员初始化与在类声明中分配默认值
【发布时间】:2013-12-14 18:50:48
【问题描述】:

我正在阅读 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 a; 创建一个Date 对象,它将a 的成员变量分配给2012 年7 月4 日。现在进行基本成员初始化有什么区别,如下所示:

// 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) {}

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

【问题讨论】:

    标签: c++ class object initialization member


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2019-09-10
          • 2015-03-22
          • 2012-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多