为什么初始化列表中不能使用箭头运算符?

Why can't I use arrow operator in initialization list?

本文关键字:运算符 初始化 列表 不能 为什么      更新时间:2023-10-16

我是c++的初学者。最近,在练习编写链表时,我尝试使用类构造函数的初始化列表将NULL分配给head->next。

在类构造函数中,它警告我的箭头运算符"应为"("或"{"。为什么会出现这样的错误?(我知道我可以在块中初始化类成员,但为什么我不能用这个指针执行此操作?)谢谢

这是我的链接列表头文件:

linkedlist.h

#include <iostream>
using namespace std;
struct node {
int val;
node *next;
};
class linkedlist {
private:
node *head;
int listlen;
public:
linkedlist();
void insert(node*, int);
void del(node*);
void reverse(node*);
void traverse(node*);
int random();
~linkedlist();
};

这是我的类构造函数:

链接列表.cpp

#include "linkedlist.h"
#include <iostream>
linkedlist::linkedlist() :listlen(0), head->next(NULL){}

通常,您只能将成员本身作为初始化列表的一部分进行初始化。如果这是您唯一的问题,那么您可以将指向NULL的下一个指针初始化为ctor主体的一部分。但是,您的成员变量head本身就是一个指针,并且当前不指向任何位置,所以我怀疑您实际上想将head本身设置为NULL(如果您使用的是c++11或更高版本,则为nullptr):

linkedlist::linkedlist() :listlen(0), head(NULL) {}

您还可以考虑在struct node中添加一个ctor,以便在初始化时将next初始化为NULL

自从你说你是新人以来,我认为还有一些事情值得指出:

  1. 请注意,初始化列表不是按照在ctor中写入的顺序运行的,而是按照成员在类主体中定义的顺序运行。在您的情况下,这个listlen实际上只有在head初始化之后才初始化为0。这对您的代码来说并不重要,但如果成员的初始化更复杂并且具有依赖关系,则可能很重要。就我个人而言,我建议始终保持初始化列表的顺序与成员定义的顺序相匹配。如果不是这样的话,某些编译器也有警告标志。

  2. 您是否考虑过使用标准库中的数据结构,而不是实现自己的链表?查看cppreference.com,了解更多关于它的好信息。特别是,根据您的用例,查看"list"、"vector"或"deque"。