[英]Base Member Initialization vs Assigning default value in class declaration
我正在阅读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) {}
有人可以解释两种情况之间的差异吗? 有什么区别,你为什么要做第二种情况? 它只是在构造函数中初始化默认值的另一种方法还是更多? 谢谢。
基本上没有区别。 在第一种情况下,您将在一个步骤中声明和定义构造函数(因此{}
括号)。 在第二种情况下,您首先声明构造函数,然后定义/实现它。 但初始化列表只能在定义中,而不能在声明中。
只要没有显式传递参数,默认参数就会被替换。 这意味着可以通过写f()
来调用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文件中定义)。
我看到默认情况下内联函数包括在类定义中定义的构造函数的唯一区别。 第二种情况允许您分隔声明和定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.