在访问某些C ++库时,我遇到了传递参数的编程风格
void foo(Matrix*& input)
所以我的问题是这个成语是做什么的,指针服务的目的是什么?
忽略cv限定符,Matrix *和Matrix *&服务一样。 [我检查代码是由经验丰富的人在谷歌LLVM框架中写的,因此只是好奇! ]
答案 0 :(得分:3)
与非const
引用任何内容的目的相同:
void foo(T& input) {
// does something that modifies input
}
T val;
foo(val);
// now val is something else, potentially
指针只是另一种类型。 foo
可能需要更改指针的值(而不是它所指向的值),因此它通过引用来获取它。
答案 1 :(得分:2)
假设您想要执行一个向它传递指针变量的函数,它会动态分配一个对象并让变量指向它。在这种情况下,您有2个选项。你要么:
void dynamicallyAllocateObject(Object **out)
{
*out = new Object();
}
或
void dynamicallyAllocateObject(Object &* out)
{
out = new Object(); // no need to dereference
}
您不能让函数接受指针,否则函数只会将此指针复制到参数变量,然后将new
返回的指针存储到此副本。因此,您将需要指针指针或指针的引用!
答案 2 :(得分:1)
表示可以在函数中更改作为参数传递给函数的原始指针,并且更改应该应用于指针。
如果要更改函数中的对象,则应通过引用传递它。指针是一种对象。
考虑创建单链表的示例。
将新节点添加到列表的功能可以采用以下方式
#include <iostream>
struct Node
{
int value;
Node *next;
};
void push_front( Node * &head, int value )
{
head = new Node { value, head };
}
int main()
{
Node *head = nullptr;
std::cout << head << std::endl;
push_front( head, 10 );
std::cout << head << std::endl;
//...
}
当第一个参数被声明为引用时,列表的原始头部将在函数中被更改。
如果删除引用,则在调用函数后不会更改原始头。
答案 3 :(得分:0)
指针并不神奇。它们就像任何其他数据一样。对指针的引用就像对任何其他数据的引用。没有特别的习语。
如果你可以填写这句话中的空白
对 X 类型的引用 可以用于_____
无论 X 是什么,你都知道什么对指针的引用是有益的。