什么是“ListNode dummy {-1,head};”意思?

时间:2014-02-27 03:22:32

标签: c++

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) { }
};

这是ListNode的定义。 ListNode dummy{-1, head};是什么意思?

2 个答案:

答案 0 :(得分:4)

这是 list-initialisation ,这是一种用于初始化C ++ 11中引入的对象的相当新的语法。

在这种情况下,这是一个错误。由于该类具有用户提供的构造函数,因此只能使用构造函数初始化它;并且这个初始化需要一个带有两个参数的构造函数,这个参数不存在。如果有合适的构造函数,比如

ListNode(int val, ListNode* next) : val(val), next(next) { }

然后它将使用它来初始化对象,传递值-1head作为构造函数参数。

如果类没有声明构造函数(或者只声明已删除或默认的构造函数),使其成为聚合,那么这将执行聚合初始化,初始化第一个成员val-1,第二个成员nexthead。但它不是聚合,所以这不会发生。

答案 1 :(得分:1)

这种语法结构

ListNode dummy{-1, head};

定义ListNode类型的对象,其名称为dummy,并使用braced init list作为初始化程序。

编译器搜索具有两个参数的类构造函数。类定义中没有这样的构造函数只有构造函数有一个参数。所以编译器会发出一个错误,它找不到合适的构造函数。

我认为你已经看过以下结构

int a[] = { 1, 2, 3 };

实际上这种结构

ListNode dummy{-1, head};

是一样的。你可以把它写成

ListNode dummy = {-1, head};

不同之处在于类ListNode具有用户定义的构造函数,因此编译器将在类中使用两个参数搜索适当的构造函数。

如果类有构造函数

ListNode(int x, ListNode *node = nullptr ) : val(x), next(node) { }

而不是

ListNode(int x) : val(x), next(nullptr) { }

然后将成功编译代码片段,因为将调用此修改后的构造函数。