C++向函数传递向量:引用和指针,哪个更好?[duplicate]

n3h0vuf2  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(135)
    • 此问题在此处已有答案**:

What are the differences between a pointer variable and a reference variable?(44个答案)
四年前关闭了。
截至3天前,社区正在审查是否重新讨论此问题。

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

在大多数情况下,这两种方法中的任何一种都可以完成这项工作。即使在这些情况下,这两种方法的执行方式是否存在任何差异?
我看不出是否有两种办法中只有一种可以奏效的情况。是否有这种情况?

  1. Q2的许多答案可能与Q1无关。
  2. Q2答案中与Q1相关的任何内容都必须由读者筛选,其中一些甚至可能无法做到这一点。
    因此,标记这是一个复制可能是更有害的比帮助读者。
pgpifvop

pgpifvop1#

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

一个引用隐含地保证不指向null。违反这个保证会导致未定义的bahvor,所以一定要检查你是否把指针转换成了引用!在我看来这是唯一的主要优点。

我看不出是否有两种方法中只有一种是可行的,是否有这样的情况呢?
如果向量在堆上,而你只持有指向它的指针,那么它可能是一个nullptr。那么你不能传递引用,因为引用可能不是空的。如果你不能这样做,它会调用未定义的行为。

3zwjbxry

3zwjbxry2#

大多数人都会同意,只要有选择,就应该首选引用而不是原始指针。
这里有理由选择其中一个或另一个吗?
指针和引用之间有一个很大的区别:引用不能为空。
如果你写了一个带指针的函数,你必须在某处加上一个nullptr检查。引用是不需要的,并且一些类型是相同的。
除此之外,指针可能会引入在使用引用时不会发生的错误(主要是由于指针运算),并且通常被认为不如引用安全。
就我个人而言,我对输入参数使用引用,但是每当函数在参数中返回一些东西时,我宁愿使用指针来在调用点上明确意图。

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

   *var = 0;
}

// somewhere else
foo(&var);

这里很清楚var可以通过foo函数修改,而使用引用时就不那么清楚了:
foo(var)
后者要求您检查函数定义,看它是否修改了var。

相关问题