在 C++ 中通过引用传递对象

kod*_*dai 1 c++ linked-list pass-by-reference

这是一个菜鸟问题,但我不确定如何在 C++ 中通过引用传递。我有以下课程,它设置了一个节点和一些功能。

class Node
{
  public:
    Node *next;
    int data;
    Node(int dat)
    {
      next = NULL;
      data = dat;
    }
    Node* getNext()
    { return next; }
    void setNext(Node *n)
    { next = n;}

    void reverse(Node *root)
    {
      Node *previous = NULL;
      while(root != NULL)
      {
        Node *next = root->getNext();
        root->setNext(previous);
        previous = root;
        root = next;
      }
      root = previous;
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,我的小班级的目的是创建一个奇异链表并具有反转它的能力。如果我在反向结束时返回名为“previous”的节点,它似乎工作正常。

但是看看我的主要功能:

int main()
{
  Node *root = new Node(1);
  Node *num2 = new Node(2);
  Node *num3 = new Node(3);
  Node *num4 = new Node(4);

  root->setNext(num2);
  num2->setNext(num3);
  num3->setNext(num4);
  root->printList();
  root->reverse(root);
  root->printList();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

为了空间起见,printList() 被省略,但它只是打印给定节点的列表。问题是,当 root->reverse(root) 被调用时,root 实际上并没有最终指向 'previous'。

输出将是这样的:

1
2
3
4
  // the value of previous from the reverse function is 4
1
Run Code Online (Sandbox Code Playgroud)

我真的不明白输出。有人愿意解释发生了什么吗?(为什么即使我做了这样的事情 root = root->reverse(root) 其中 reverse 返回以前,列表也不会反转)为什么 root 现在只指向自己?我是 C++ 新手,感谢您的帮助!

Ara*_*ion 5

C++ 支持引用语义。因此,对于给定的函数:

void foo(Bar& bar);
Run Code Online (Sandbox Code Playgroud)

要通过引用传递,您可以:

int main() {
  Bar whatsit;

  foo(whatsit);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

就是这样!

这通常与传递指针混淆,对于函数,例如:

void foo(Bar* bar);
Run Code Online (Sandbox Code Playgroud)

你会这样做:

int main() {
  Bar whatisit;

  foo(&whatsit);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

区别主要是语义问题: - 引用始终有效。没有理由检查 NULL 指针。- 指针可能为 NULL,因此应进行检查。

但是,如果程序员决定作恶并滥用引用语义,则引用可能会引用 NULL 指针,但原则仍然存在。