C++ 什么是;ListNode虚拟{-1,head}&引用;什么意思?
这是C++ 什么是;ListNode虚拟{-1,head}&引用;什么意思?,c++,C++,这是ListNode的定义。什么是listnodedummy{-1,head}意思?这是列表初始化,一种在C++11中引入的用于初始化对象的全新语法 在这种情况下,这是一个错误。由于类具有用户提供的构造函数,因此只能使用构造函数初始化它;这个初始化需要一个构造函数,它有两个参数,而这两个参数是不存在的。如果有合适的构造函数,比如 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), nex
ListNode
的定义。什么是listnodedummy{-1,head}代码>意思?这是列表初始化,一种在C++11中引入的用于初始化对象的全新语法
在这种情况下,这是一个错误。由于类具有用户提供的构造函数,因此只能使用构造函数初始化它;这个初始化需要一个构造函数,它有两个参数,而这两个参数是不存在的。如果有合适的构造函数,比如
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) { }
};
然后它将使用它初始化对象,将值-1
和head
作为构造函数参数传递
如果类没有声明构造函数(或者只声明已删除或默认的构造函数),使其成为聚合,那么这将执行聚合初始化,将第一个成员val
初始化为-1
,将第二个成员下一个成员初始化为head
。但它不是一个集合,所以这不会发生。这个句法结构
ListNode(int val, ListNode* next) : val(val), next(next) { }
int a[] = { 1, 2, 3 };
定义名为dummy的ListNode类型的对象,并使用带括号的init list作为初始值设定项
编译器搜索具有两个参数的类构造函数,类定义中没有此类构造函数,只有具有一个参数的构造函数。因此编译器将发出一个错误,它没有找到合适的构造函数
我想你已经看到了以下结构
ListNode dummy{-1, head};
其实这个构造
ListNode(int val, ListNode* next) : val(val), next(next) { }
int a[] = { 1, 2, 3 };
是一样的。你可以把它写成
ListNode dummy{-1, head};
不同之处在于,类ListNode具有用户定义的构造函数,因此编译器将使用类中的两个参数搜索适当的构造函数
如果类有构造函数
ListNode dummy = {-1, head};
而不是
ListNode(int x, ListNode *node = nullptr ) : val(x), next(node) { }
然后将成功编译代码段,因为将调用此修改过的构造函数。该构造函数不应编译ListNode
不是聚合(它有一个用户提供的构造函数),因此不能使用聚合初始化来初始化dummy
,并且它没有带两个参数的构造函数。不,它不是ListNode
具有用户提供的构造函数,因此它不是聚合,不符合聚合初始化条件。此外,它没有初始值设定项列表构造函数,也没有可以接受两个参数的构造函数。@nneonneo不,不是。@karllo你的编译器是什么?@BrianBi:是的,我的错,它没有带两个参数的构造函数。不知何故,我误读了C++中的五行,在我的许可证中翻的时间。如果编译,我假设使用的特定编译器允许在这种情况下类似于聚合初始化,作为语言的扩展。(只要发出警告,这样做是合法的。)我为自己的学究气感到难过,但是如果构造函数是ListNode()=default代码>,可以在不使用构造函数的情况下对其进行初始化。此构造函数不是用户提供的,因此可以使用聚合初始化,而聚合初始化不使用该构造函数。@chris:确实如此。我已经让语言更友好,希望不会太模糊意思。”MikeSeymour,我必须说初始化是C++中的一件事情,在那里很容易低估整个复杂度。我发现在不查找的情况下很难记住这些要点,即使这样,它们中的很多都会随着标准的变化而变化(比如聚合初始化比复制初始化更受欢迎,复制初始化在C++17中可能会发生变化)。