我正在从Herbert Schildt的书中学习C ++"教自己C ++第3版"。在一个示例代码中,有些东西让我很困惑。
#include <iostream>
using namesapce std;
template <class data_t> class list {
data_t data;
list *next;
public:
list(data_t d);
void add(list *node) {node->next = this; next = 0; }
list *getnext() { return next;}
data_t getdata() { return data;}
};
我没有在示例中编写所有代码,我只写了类声明。 在这里,我没有理解一部分。首先,&#34; *节点&#34;指针属于&#34;添加&#34;功能,正在使用&#34; node-&gt; next&#34; for&#34; * next&#34;指针。我没有理解这里的目标,为什么我们不直接使用像{&#34; next = this; next = 0;}?另外,我们如何使用空指针(*节点)指向另一个空指针(* next)?我想念一些关键概念,谢谢你的帮助。
答案 0 :(得分:0)
在函数add()
中:
template<typename data_t>
class list {
// ...
void add(list *node) {node->next = this; next = 0; }
// ...
};
该功能的目的是将this
添加到列表中,作为node
之后的下一个元素。把它想象成一列火车:add()
告诉当前的汽车将自己挂在另一辆汽车的后面,功能的参数告诉它要链接到哪辆车。
请注意,此函数要求node
不为空指针;如果它为null,则可能会出现分段错误。
void add(list* node) {
node->next = this; // Tells "node" to register the current node as its "next" node.
// Should first check whether "node" is a valid pointer.
next = 0; // Tells the current node to register a null pointer as its "next" node,
// signifying that it's currently the last node in the list.
// Note that instead of assigning 0, it should instead assign either
// "nullptr" (C++11 or later) or "NULL" (pre-C++11).
}
因此,当这样使用时:
list<int> start(42), second(24);
second.add(&start);
它将执行以下操作:
(&start)->next = &second;
(&second)->next = 0;
这会创建一个单链表,如下所示:
Start: "start"
--> Next: "second"
--> Next: None.
或者,更简洁:
start->second->NULL
请记住,当在非静态成员函数内部时,除非另有说明,否则假定任何成员变量访问都在this
上运行。
template<typename data_t>
void list<data_t>::add(list* node) {
node->next = this; // Operates on node, not on this.
next = 0; // Operates on this; becomes "this->next = 0;"
}
如果此函数只是{next = this; next = 0;}
,那么它将是:
template<typename data_t>
void list<data_t>::add(list *node) {
this->next = this; // Bad. Creates a circular linked list, where "this" is ALWAYS the
// next node after "this".
this->next = 0; // Renders the above line entirely pointless, by indicating that there
// are no nodes after "this".
}