除了编程风格之外,为什么习惯使用“引用指针”?

时间:2016-02-28 16:33:47

标签: c++ reference

在访问某些C ++库时,我遇到了传递参数的编程风格

void foo(Matrix*& input)

所以我的问题是这个成语是做什么的,指针服务的目的是什么?

忽略cv限定符,Matrix *和Matrix *&服务一样。 [我检查代码是由经验丰富的人在谷歌LLVM框架中写的,因此只是好奇! ]

4 个答案:

答案 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 是什么,你都知道什么对指针的引用是有益的。