指针和双向链表

时间:2017-09-28 14:46:07

标签: c++ pointers new-operator heap-memory doubly-linked-list

我目前正在使用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 }?是否有一些我错过的订单或评估或概念?

2 个答案:

答案 0 :(得分:4)

首先在右侧进行评估,然后operator=开始进行评估。这是由operator=的优先级引起的。请参阅C++ Operator Precedence

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

在第二行,你创建一个名为“Odin”的Link和一个继承人norse_god,它在施工时仍然指向Thor。

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

这种行为对于类C语言来说是正常的。

答案 1 :(得分:2)

首先评估右侧的表达式。这会评估norse_gods的旧值。完成此评估后,将完成分配,并将对新创建的对象的引用分配给norse_gods