Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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++ 什么是;ListNode虚拟{-1,head}&引用;什么意思?_C++ - Fatal编程技术网

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中可能会发生变化)。