为什么除了编程风格之外还使用成语"Reference to pointer"?
Why is idiom "Reference to pointer" used besides programming style?
在访问C++一些库时,我遇到了传递参数的编程风格
void foo(Matrix*& input)
所以我的问题是这个成语有什么作用,引用指针有什么用?
忽略 cv 限定符,Matrix* 和 Matrix* 并提供服务。[我检查代码是由谷歌经验丰富的人在LLVM框架中编写的,因此只是好奇!
非const
引用任何内容的目的相同:
void foo(T& input) {
// does something that modifies input
}
T val;
foo(val);
// now val is something else, potentially
指针只是另一种类型。 foo
可能需要更改指针的值(而不是它指向的值),因此它通过引用来获取它。
假设你想做一个函数,你给它一个指针变量,它动态分配一个对象,让变量指向它。在这种情况下,您有 2 个选项。你要么做:
void dynamicallyAllocateObject(Object **out)
{
*out = new Object();
}
或
void dynamicallyAllocateObject(Object &* out)
{
out = new Object(); // no need to dereference
}
您不能只让函数接受指针,否则函数将简单地将此指针复制到参数变量,然后将new
返回的指针存储到此副本。因此,您将需要一个指针的指针,或对指针的引用!
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;
//...
}
由于第一个参数被声明为引用,因此列表的原始头部将在函数中更改。
如果删除引用,则在调用函数后不会更改原始头部。
指针
并不神奇。它们与任何其他数据一样是数据。对指针的引用就像对任何其他数据的引用一样。没有特别的成语。
如果你能填空这句话
对类型 X
的引用 可用于 _____
不管 X 是什么,那么你都知道对指针的引用有什么用。
相关文章:
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 不断"Attempting to reference a deleted function"
- 如何在C++中最好地实施"newtype"成语?
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- std::iterator::reference 必须是引用吗?
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 为什么在使用 SDL2 时仍然收到'undefined reference'链接器错误?
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- 当我不关心顺序并且没有重复项时,更快的擦除删除成语?
- 可以使用while(文件>>...C++成语在 Cython 中读取文件?
- Libcurl c++ "undefined reference to" (Windows/MinGW/g++)
- C++返回类型 T(&)[] 与使用 reference = T(&)[] 作为返回类型
- const auto & 和 auto & if reference 对象之间的区别是 const
- 为什么除了编程风格之外还使用成语"Reference to pointer"?