为什么没有可用于结构的默认构造函数?

Why there's no default constructor available for struct?

我有一个结构:

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

我正在尝试初始化它:

ListNode* res = new ListNode();
ListNode* start = res;

但我得到:

error C2512: 'ListNode' : no appropriate default constructor available

为什么?

编译器不会为您生成默认值,因为您已经定义了构造函数。只需向其添加一个默认构造函数或向您的参数添加一个默认构造函数(与严格意义上的默认构造函数不同),像这样

struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x = 0) : val(x), next(NULL) {}
};

此外,请改用 nullptr

but am getting:

error C2512: 'ListNode' : no appropriate default constructor available

Why?

您肯定会遇到该错误,因为您没有为 ListNode 声明默认构造函数。关于这一点,错误消息非常清楚。

一旦您声明了自定义构造函数 ListNode(int x);,编译器就不再为您生成默认构造函数。


要解决这个问题,要么声明一个默认构造函数1

 ListNode() : val(), next(NULL) {}

或调用已声明的

 ListNode* res = new ListNode(42);

1) struct 在这方面的行为与 class 没有任何不同(如果这应该引起您的混淆)。

在此声明中

ListNode* res = new ListNode();

这里调用了默认构造函数。

然而根据结构定义

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

该结构具有参数化构造函数。

实际上不需要为此结构声明构造函数。

最好声明为聚合

struct ListNode {
     int val;
     ListNode *next;
};

最初列表应该是一个nullptr指针。例如

ListNode *start = nullptr;

如果您希望列表最初包含一个节点,那么您可以这样写

ListNode *start = new ListNode { 10, nullptr };