[英]Pointers and doubly-linked list
我目前在“编程:使用C ++的原理和实践”的第17章,并且遇到了双向链表上的代码。 之前曾有人问过这组代码问题(例如,双向链接列表中的成员访问权限 ),但是我没有被问到/回答。
该代码基本上将“ Freya”安排为“ Odin”的前身,并使“ Odin”成为“ Thor”的前身,反之亦然。 代码如下:
struct Link {
string value;
Link* prev;
Link* succ;
Link(const string& v, Link* p = nullptr, Link* s = nullptr)
: value(v), prev(p), succ(s) {}
};
int main()
{
Link* norse_gods = new Link{ "Thor", nullptr, nullptr };
norse_gods = new Link{ "Odin", nullptr, norse_gods };
norse_gods->succ->prev = norse_gods;
norse_gods = new Link{ "Freya", nullptr, norse_gods };
norse_gods->succ->prev = norse_gods;
}
我想知道的是为什么代码:
norse_gods = new Link{ "Odin", nullptr, norse_gods }
能够指向旧地址: new Link{ "Thor", nullptr, nullptr }
,并使Thor成为Odin的后继者,因为norse_god
应该已经指向新地址: new Link{ "Odin", nullptr, norse_gods }
? 我缺少一些命令,评估或概念吗?
首先在右侧进行评估,然后operator=
进入并执行分配。 这是由operator=
的优先级引起的。 请参阅C ++运算符优先级 。
在main
的第一行,您将创建一个名为“ Thor”的Link
,并将norse_gods
指向该Link
。
在第二行中,您将创建一个名为“ Odin”和后继项norse_god
的Link
,该Link
在构建时仍指向Thor。
此后, norse_gods
将更新为指向“ Odin”。
对于类似C的语言,此行为是正常的。
首先评估右侧的表达式。 这将评估使用norse_gods
的旧值。 评估完成后,便完成分配,并将对新创建对象的引用分配给norse_gods
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.