簡體   English   中英

在C ++中通過引用傳遞對象

[英]Passing a object by reference in c++

這是一個noobie問題,但是我不確定如何在C ++中通過引用傳遞。 我有以下用於設置Node和一些功能的類。

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;
    }
};

現在,我的小班課程的目的是創建一個單鏈接列表,並具有將其反向的功能。 如果我在反向操作的末尾返回名為“ 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;
}

為了節省空間,省略了printList(),但它只打印給定節點的列表。 問題是,當調用root-> reverse(root)時,root實際上並沒有最終指向“ previous”。

輸出將是這樣的:

1
2
3
4
  // the value of previous from the reverse function is 4
1

我真的不明白輸出。 有人在乎解釋發生了什么嗎? (即使我做了類似root = root-> reverse(root)的操作(為什么反向返回先前的內容,為什么列表沒有被反轉),為什么現在根僅指向自身呢? 我是C ++的新手,感謝您的幫助!

C ++支持引用語義。 因此,對於給定的功能:

void foo(Bar& bar);

要通過引用傳遞您,請執行以下操作:

int main() {
  Bar whatsit;

  foo(whatsit);

  return 0;
}

而已!

這通常與傳遞指針相混淆,其中對於函數,如:

void foo(Bar* bar);

您可以這樣做:

int main() {
  Bar whatisit;

  foo(&whatsit);

  return 0;
}

區別主要是語義問題:-引用始終有效。 沒有理由檢查NULL指針。 -指針可以為NULL,因此應進行檢查。

但是,如果程序員認為是邪惡的並且濫用引用語義,則引用可以引用NULL指針,但是原理仍然存在。

您沒有通過引用。 您正在傳遞指針的副本。 該副本仍指向同一節點,但仍只是具有本地作用域的副本。 基本上,它是另一個指針,指向main中的指針所指向的節點(ha!)。 在函數的末尾,您的分配是在此指針副本previous進行分配,然后函數結束,並且副本超出范圍。 您在main中的指針保持不變。

返回/分配指針有效的原因是,此副本已被設置為所需的副本被返回並分配給main中的指針。

您可以通過多種方式解決此問題。 將引用傳遞給指針(丑陋的imo),使用引用或返回root並進行賦值。

要通過引用傳遞指針,可以將reverse聲明為:

void reverse(Node*& root) {
  // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM