struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) { }
};
这是ListNode
的定义。 ListNode dummy{-1, head};
是什么意思?
答案 0 :(得分:4)
这是 list-initialisation ,这是一种用于初始化C ++ 11中引入的对象的相当新的语法。
在这种情况下,这是一个错误。由于该类具有用户提供的构造函数,因此只能使用构造函数初始化它;并且这个初始化需要一个带有两个参数的构造函数,这个参数不存在。如果有合适的构造函数,比如
ListNode(int val, ListNode* next) : val(val), next(next) { }
然后它将使用它来初始化对象,传递值-1
和head
作为构造函数参数。
如果类没有声明构造函数(或者只声明已删除或默认的构造函数),使其成为聚合,那么这将执行聚合初始化,初始化第一个成员val
到-1
,第二个成员next
到head
。但它不是聚合,所以这不会发生。
答案 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) { }
然后将成功编译代码片段,因为将调用此修改后的构造函数。