我正在阅读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) {}
有人可以解释两种情况之间的差异吗?有什么区别,你为什么要做第二种情况?它只是在构造函数中初始化默认值的另一种方法还是更多?谢谢。
答案 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)
。
答案 2 :(得分:1)
我看到唯一的区别是默认情况下内联函数包括在类定义中定义的构造函数。 第二种情况允许您分隔声明和定义。