[英]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.