C ++将向量传递给函数:引用与指针,哪个是首选? [复制]

Posted

技术标签:

【中文标题】C ++将向量传递给函数:引用与指针,哪个是首选? [复制]【英文标题】:C++ passing vectors to functions: reference vs. pointer, which is preferred? [duplicate] 【发布时间】:2018-09-10 10:01:04 【问题描述】:

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

我看到有(很多/全部?)两个案例中的任何一个都可以完成这项工作。 即使在这些情况下,这两种方法的执行方式有什么不同吗?

我不知道是否有两种情况中只有一种会起作用。 有这种情况吗?

编辑:引用的问题(关于一般差异指针与参考)包含对此 OP 的答案非常相关,但我怀疑这是一个骗局. 关于传递给函数的指针和引用之间的差异,肯定可以从那里的答案中推断出来,但它们也可能比那里询问的一般差异更具体。因此,并非所有答案都可能与此处相关。此外,这里的一些答案可能只是部分相关。

【问题讨论】:

另见When to pass by reference and when to pass by pointer in C++?、Pass vectors by pointer and reference in c++、Vector pointers and passing objects by reference in C++、What are the differences between a pointer variable and a reference variable in C++?、Difference between references and pointers等 【参考方案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。

【讨论】:

引用没有值语义,不像普通指针。这会破坏编译器生成的赋值并移动构造函数/赋值。引用旨在启用运算符重载,而不是替换指针。 “如果你写一个接受指针的函数,你必须在某处添加一个 nullptr 检查。” 不。 @MaximEgorushkin - 所以在某些运算符重载的情况下,使用指针根本无法代替引用的使用?你愿意提供一个简单的这样的例子吗? @sancho.s 在a + ba 和/或b 是用户定义类的左值,operator+ 不能用指针重载(这需要要写成&a + &b 的表达式,它不适用于r 值)。 @MaximEgorushkin - 对。谢谢。【参考方案2】:

这主要是偏好。我遵循以下规则:尽可能使用 (const) 引用,必要时使用 (const) 指针。

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

我不知道是否存在两种情况中只有一种会起作用的情况。有没有这样的案例?

如果向量在堆上并且你只持有一个指向它的指针,那么它可能是一个 nullptr。比你不能传递引用,因为引用可能不是空的。如果你不这样做,它会调用未定义的行为。

【讨论】:

Reference 还允许捕获时间。你不能做一个指向时间的指针! @Swift-FridayPie 是的,但我不确定如何使用它来传递参数。 @Swift-FridayPie 好吧,我捕获了一个引用并将其传递给一个函数。但是这种传递可以再次通过引用或通过ptr。

以上是关于C ++将向量传递给函数:引用与指针,哪个是首选? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将指针向量传递给c ++中的函数[重复]

C与C++关于*与&的传参解析

C与C++关于*与&的传参解析

将c ++引用的地址传递给指针

C与C++关于*与&的传参解析

数组名作函数参数时,实参与形参变量之间的数据传递是?