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

What does "ListNode dummy{-1, head};" mean?

本文关键字:是什么 意思 ListNode dummy head      更新时间:2023-10-16
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) { }
};

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

这就是列表初始化,一种用于初始化 C++11 中引入的对象的新语法。

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

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

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

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

这种语法结构

ListNode dummy{-1, head};

定义一个类型为 ListNode 的对象,该对象名为 dummy,并使用大括号初始化列表作为初始值设定项。

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

我想你看到了以下结构

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) { }

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