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++ 新手,感谢您的帮助!
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 指针,但原则仍然存在。
| 归档时间: |
|
| 查看次数: |
8346 次 |
| 最近记录: |