Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在构造函数中对我来说是未知的_C++_Constructor - Fatal编程技术网

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++中的标量类型。