C ++将向量传递给函数:引用还是指针,哪个是首选?

时间:2018-09-10 10:01:04

标签: c++ pointers reference

将向量传递给函数时,应使用哪种方法:引用还是指针?

我看到在很多情况下,两者中的任何一个都能胜任。 即使在这些情况下,两种方法的执行方式是否也存在差异?

我看不出是否只有两种情况之一可以工作。 有这种情况吗?

编辑:引用(关于一般差异指针与引用的问题)包含此操作规范的答案非常相关,但我怀疑这是一个骗子。 指针和引用之间的差异(就传递给函数而言)可以肯定地从那里的答案中推断出来,但它们可能比那里的一般差异更加具体。因此,并非所有答案都与此处相关。此外,这里的一些答案可能仅部分相关。

2 个答案:

答案 0 :(得分:1)

这主要是首选项。我遵循以下规则:在可以时使用(const)引用,在必须时使用(const)指针。

引用隐式保证不指向null 。违反此保证会导致不确定的行为,因此请确保检查是否将指针转换为引用!我认为这是唯一的主要优势。

  

我看不出是否只有两种情况之一可以工作。有这种情况吗?

如果向量在堆上,而您仅持有指向它的指针,则它可能是nullptr。比您不能传递引用,因为引用不能为空。如果这样做失败,则会调用未定义的行为。

答案 1 :(得分:1)

大多数人都会同意,只要您有选择,引用将比原始指针优先。

  

有什么理由在这里偏爱一个或另一个吗?

指针和引用之间有一个很大的区别:引用不能为空。

如果编写带有指针的函数,则必须在某处添加nullptr检查。使用不需要的引用,并且与某些键入相同。

除此之外,指针还会引入使用引用时不会发生的错误(主要是由于指针算法),并且通常被认为不如引用安全。


我个人使用输入参数的引用,但是每当函数在参数中返回某些内容时,我都希望使用一个指针在调用站点上明确意图。

void foo(int* var) {
   /*
    there may be a lot of code here
   */

   *var = 0;
}

// somewhere else
foo(&var);

很明显,var可以通过foo函数进行修改,而使用引用时却不清楚:

foo(var)

后者要求您检查函数定义以查看其是否修改了var。