Ниже приведен мой код, в котором я определил два класса Node
и List
, которые делают то, что вы думаете, они делают. При расширении списка мне нужно создать новый объект 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)
здесь? Почему вывод второго случая такой странный?
Обратите внимание, что я использовал опцию -fpermissive для моего компилятора TDM-G CC -64-5.1.0. Хотя это кажется как плохой выбор, я только что понял, что я на самом деле не уверен в том, как долго живет объект Node, созданный выражением Node(data)
. Надеюсь, этот вопрос будет по-прежнему полезен для тех, у кого может быть такая же путаница.
#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();
}