为什么习语是;引用指针“;除了编程风格之外还使用了什么? 在C++的一些库中,我遇到了传递参数的编程风格。 void foo(Matrix*& input)
所以我的问题是,这个习语是做什么的,引用指针的目的是什么为什么习语是;引用指针“;除了编程风格之外还使用了什么? 在C++的一些库中,我遇到了传递参数的编程风格。 void foo(Matrix*& input),c++,reference,C++,Reference,所以我的问题是,这个习语是做什么的,引用指针的目的是什么 忽略cv限定符,矩阵*和矩阵*&服务相同。[我检查过代码是由谷歌有经验的家伙在LLVM框架下编写的,因此很好奇!]与非常量引用任何东西的用途相同: void foo(T& input) { // does something that modifies input } T val; foo(val); // now val is something else, potentially 指针只是另一种类型foo可能需要更
忽略cv限定符,矩阵*和矩阵*&服务相同。[我检查过代码是由谷歌有经验的家伙在LLVM框架下编写的,因此很好奇!]与非
常量
引用任何东西的用途相同:
void foo(T& input) {
// does something that modifies input
}
T val;
foo(val);
// now val is something else, potentially
指针只是另一种类型
foo
可能需要更改指针的值(与指针指向的相反),因此它通过引用获取指针 In表示作为参数传递给函数的原始指针可以在函数中更改,并且更改应应用于指针
如果要更改函数中的对象,应通过引用将其传入。指针是一种对象
考虑一个创建单链接列表的示例
向列表中添加新节点的函数可以如下所示
#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;
//...
}
#包括
结构体类型
{
int值;
节点*下一步;
};
无效推前(节点*&头部,int值)
{
head=新节点{值,head};
}
int main()
{
节点*head=nullptr;
指针并不神奇。它们和其他数据一样都是数据。对指针的引用就像对其他数据的引用一样。没有特殊的习惯用法
如果你能填空这个句子
对类型X的引用
可用于_____
无论X是什么,您都知道对指针的引用有什么好处。假设您要执行一个函数,向它传递一个指针变量,它动态分配一个对象并让变量指向它。在这种情况下,您有两个选项。您可以:
void dynamicallyAllocateObject(Object **out)
{
*out = new Object();
}
或
你不能只让函数接受一个指针,否则函数会简单地将这个指针复制到参数变量,然后将new
返回的指针存储到这个副本中。因此,你将需要一个指针的指针,或者一个指针的引用!查找大量的问题,如何获得指针的头部正确初始化链表实现的一部分。“编程风格”似乎不是这样编写所示函数的好理由。它可以(也可能应该)同样声明为Matrix*foo(Matrix*)
。然后,作为调用方,我可以决定是否要在适当的位置更改指针(p=foo(p)
vsfoo(p);
)与否(auto q=foo(p);
vsauto q=p;foo(q);
)。@5gon12eder取决于,对吧?如果它像bool foo(Matrix*&)
?@Barry True,但这是另一个问题。上面显示的函数返回void
。但即使是bool foo(Matrix*&)
最好是Matrix*foo(Matrix*)
(使用nullptr
作为特殊值)、可选foo(Matrix*)
、std::pair foo(Matrix*)
或任何适用于传达所需语义的内容。“忽略cv限定符,Matrix*和Matrix*&服务相同”不是真的。。
void dynamicallyAllocateObject(Object &* out)
{
out = new Object(); // no need to dereference
}