gpt4 book ai didi

c++ - 创建新对象时使用 `new classObject` 和 `&classObject` 有什么区别?

转载 作者:行者123 更新时间:2023-12-01 23:23:45 25 4
gpt4 key购买 nike

下面是我的代码,其中我定义了两个类 NodeList 来执行您认为它们执行的操作。在扩展列表时,我需要创建一个新的 Node 对象(请参阅代码中带有注释的行)。如果我使用 new Node(data) 那么一切看起来都很好并且输出是

2 3 5

但是如果我将其更改为 &Node(data),输出将变为

7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648
7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648 7530648

(等等;除非我关闭窗口,否则不会结束)

这里使用new Node(data)&Node(data)有什么区别?为什么第二种情况的输出这么奇怪?

请注意,我为 TDM-GCC-64-5.1.0 编译器使用了 -fpermissive 选项。虽然这看起来是一个糟糕的选择,但我刚刚意识到我实际上不确定的是如何long 由表达式 Node(data) 创建的 Node 对象存在。所以希望这个问题对于那些可能有同样困惑的人来说仍然有用。

#include<iostream>
using namespace std;

class Node
{
int _data;
Node* _next;
public:
Node(int data) { _data = data; _next = 0; }
void setNext(Node* next) { _next = next; }
Node* getNext() const { return _next; }
int getData() const { return _data; }
};

class List
{
Node* _head;
public:
List() { _head = 0; }
void add(int data)
{
if(!_head)
{
_head = new Node(data);
return;
}
Node* temp = _head;
while(temp->getNext())
temp = temp->getNext();
temp->setNext(new Node(data)); // What if I use `&Node(data)` instead of `new Node(data)`?
}
void print() const
{
Node* temp = _head;
while(temp)
{
cout<<temp->getData()<<" ";
temp = temp->getNext();
}
}
};


int main()
{
List L;
L.add(2);
L.add(3);
L.add(5);
L.print();
}

最佳答案

What is the difference between using new classObject and &classObject

new classObject 创建具有动态存储的 classObject 类型的新对象。

&classObject 返回由标识符 classObject 命名的对象的地址。

&Node(data)

该表达式的格式不正确。这里的addressof运算符的操作数是一个右值。这是不允许的。成功编译程序不需要编译器,并且该标准没有描述程序应该如何运行。以下是随机选择的编译器的输出示例:

error: taking the address of a temporary object of type 'Node' [-Waddress-of-temporary]
temp->setNext(&Node(data));
^~~~~~~~~~~

但是,某些编译器确实允许将其作为语言扩展。在这种情况下,这将创建一个 Node 类型的临时对象。临时变量的生命周期持续到完整表达式结束为止。 addressof 运算符应用于临时对象,结果是指向临时对象的指针。完整表达式后,指针值将无效。

尝试通过无效指针访问其生命周期之外的临时对象将产生未定义的行为。

Why is the output of the second case so weird?

因为程序的行为未定义。


Node* _next;
void setNext(const Node* next) { _next = next; }

指向 const 的指针不能隐式转换为指向非 const 的指针。这也是不规范的。以下是随机选择的编译器的输出示例:

error: assigning to 'Node *' from incompatible type 'const Node *'
void setNext(const Node* next) { _next = next; }
^~~~

关于c++ - 创建新对象时使用 `new classObject` 和 `&classObject` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61272941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com