为什么初始化列表中不能使用箭头运算符?
Why can't I use arrow operator in initialization list?
我是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
。
自从你说你是新人以来,我认为还有一些事情值得指出:
-
请注意,初始化列表不是按照在ctor中写入的顺序运行的,而是按照成员在类主体中定义的顺序运行。在您的情况下,这个
listlen
实际上只有在head
初始化之后才初始化为0。这对您的代码来说并不重要,但如果成员的初始化更复杂并且具有依赖关系,则可能很重要。就我个人而言,我建议始终保持初始化列表的顺序与成员定义的顺序相匹配。如果不是这样的话,某些编译器也有警告标志。 -
您是否考虑过使用标准库中的数据结构,而不是实现自己的链表?查看cppreference.com,了解更多关于它的好信息。特别是,根据您的用例,查看"list"、"vector"或"deque"。
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 为什么初始化时没有调用重载赋值运算符?
- 使用运算符"="在C++中用值初始化对象
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 在未初始化的变量上使用复合赋值运算符(+=, ..)不是C++中的UB?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- C++ 类型 'complex<double>' 中类中的复杂初始化不提供调用运算符
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- 使用三元运算符初始化类对象错误
- 使用三元运算符初始化引用变量
- 使用new运算符初始化数组
- 使用相等运算符初始化对象
- 使用和不使用新运算符初始化对象