我目前在“编程:使用C ++的原理和实践”的第17章,并且遇到了双向链表上的代码。之前曾有人问过这组代码的问题(例如Member access in a doubly-linked list),但是我没有被问到/回答过的问题。

该代码基本上将“ 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++ Operator Precedence

main的第一行,您将创建一个名称为“ Thor”的Link,并将norse_gods指向它。

在第二行中,您将创建一个名为“ Odin”和后继者Linknorse_god,在构建时它仍指向Thor。

之后,norse_gods被更新为指向“ Odin”。

对于类似C的语言,此行为是正常的。

关于c++ - 指针和双向链表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46472051/

10-10 03:10