C++ C++;在构造函数中对我来说是未知的
可能重复:C++ C++;在构造函数中对我来说是未知的,c++,constructor,C++,Constructor,可能重复: 下面是代码的草图。我不明白这一行-Queue():第一(0),最后(0){}。 first(0)是什么意思。我知道并理解排队的概念。我已经编码了很多次,但不知道C++中的含义。 class Queue{ struct Element{ double val; Element* next; }*first, *last; void insert(double x); void get(double &x); public: Queue():f
下面是代码的草图。我不明白这一行-
Queue():第一(0),最后(0){}
。
first(0)
是什么意思。我知道并理解排队的概念。我已经编码了很多次,但不知道C++中的含义。
class Queue{
struct Element{
double val;
Element* next;
}*first, *last;
void insert(double x);
void get(double &x);
public:
Queue():first(0), last(0){}
};
这是一个成员初始化列表。行
Queue():first(0),last(0){}
定义了Queue
的默认构造函数,该构造函数将first
和last
成员初始化为0,然后不做任何其他操作
成员first
和last
都属于元素*
(元素的指针
)类型,0
是空指针常量。当使用0
初始化时,第一个和最后一个是空指针。它是一个空指针。它允许您直接使用要分配的值构造成员变量,而不是默认先构造它们,然后在构造函数体中分配它们
假设您有一个类a
,它有一个默认构造函数和一个接受一个参数的构造函数:
struct A
{
A() : n(0) { } // For scalar types, n = 0 in the constructor's body is equivalent
A(int n) : n(a) { } // Should be marked as "explicit", but not relevant here
int a;
};
类X
,其成员变量类型为a
。X
的构造函数接受类型为int
的参数,该参数需要分配给A
的变量A
。如果没有初始化列表,您可以这样做:
struct X
{
X(int n) { a.a = n; } // First invoke A::A(), then assign n to a.a
A a;
};
但是这里有两条指令,而不是一条指令:成员变量a
的默认构造(可能很昂贵),然后是根据需要更改其状态的赋值。如果您已经知道应该使用哪些参数来构造a
,那么首先执行默认构造来覆盖该初始化是没有意义的
但是,必须指出的是,当初始化标量类型时(如您的示例所示),基于初始化列表的表单等同于基于构造函数主体中的常规赋值的表单,因为标量类型在默认情况下不是零初始化的(更准确地说,它们不会以任何方式初始化)
作为相关信息,在初始化列表中,构造函数参数的名称不会隐藏要构造的成员变量的名称:
struct X
{
X(int a) : a(a) { } // OK (although I do not like it)
int a;
};
相反,在常规赋值中,a
将被视为赋值双方的构造函数参数:
struct X
{
X(int a) { a = a; } // Self-assignment of the constructor's argument...
int a;
};
这是说,我不认为对成员变量和函数参数使用相同的名称是一个好的做法。我之所以提到它,是因为如果您必须阅读其他人编写的代码,最好能意识到这一点。
在这种特殊情况下,由于我们处理的是标量类型,它相当于:
Queue()
{
first = 0;
last = 0;
}
好的,我在尝试关闭它时遇到了一些问题,但是另外一个问题是:您能否以比示例代码中显示的更少的快捷方式为我提供等效的方法。Robert,一种“更少的快捷方式”(但并非在所有情况下都完全等效)的方法是:Queue(){first=0;last=0;}
我觉得有必要澄清一下,标量类型不是在句号内初始化的。@chris:好的,让我重新表述一下。但是first和last不是int或double,所以如何将其初始化为0?@RobertKilar请参阅我的编辑。但是first和last不是数字,而是对象。我不确定你的意思first
和last
是指针,您可以用常量零初始化指针。指针也是C++中的标量类型。