【问题标题】:Is there any advantage of using references instead of pointers in c++? [duplicate]在 C++ 中使用引用而不是指针有什么好处吗? [复制]
【发布时间】:2012-05-08 18:01:42
【问题描述】:

可能重复:
What are the differences between pointer variable and reference variable in C++?

例如,我有两个功能做同样的事情:

int func(int &a)
{
   return a+1;
}

int func2(int *a)
{
   return *a+1;
}

在调用这些函数中的任何一个时,使用 func 比 func2 有什么优势?

【问题讨论】:

  • 在我看来,唯一的优势是能够接受 NULL 参数。关于这个主题已经有一些很好的问题了。
  • 我之所以问这个问题是因为我们小组项目中的一位朋友坚持我们使用引用而不是指针,声称引用比指针“优越”。我想我会坚持使用指针,因为在做了一些 C 项目后我已经习惯了。
  • @user803253:是的,只要你可以使用它们,它们就更胜一筹——它们承认的错误比指针少。
  • @user803253:这不是能够很好地管理指针的问题。这是一个防止每个人都犯的“愚蠢”错误的问题。例如,passing null pointers to functions that require pointers to data。如果编译器可以为您捕捉错误,为什么不利用这一事实呢?

标签: c++ pointers reference


【解决方案1】:
  • 引用不能直接赋值为null,但指针可以。
  • 不能将引用重新分配为指向其他对象,但指针可以。

这两者都可以是优点或缺点,视情况而定。

【讨论】:

  • @VladLazarenko 如果我没记错的话,构造 null 引用是未定义的行为。
  • @VladLazarenko 只有在格式错误的程序中才能引用NULL,所以说它们不能是NULL 基本上是正确的。
  • @Kaz 他的意思是它是指针的语法糖。
  • @MarkRansom 是的,但是将格式错误的程序中未定义的行为包含在我们可以做什么和不可以做什么的定义中是没有意义的。所以引用不能是NULL,因为标准是这样说的,任何其他行为都超出了宇宙的范围。你不这么认为吗?
  • @SethCarnegie,我的态度因引用结果为 NULL 引起的多天调试会话而受到影响。它甚至不是我的代码!
【解决方案2】:

你的两个函数都错了。由于它们不会修改传入的参数,因此应该将它们作为 const 接收,如下所示:

int func(const int &a)
{
    return a+1;
}

int func2(const int *a)
{
    return *a+1;
}

现在这是引用的一个优势,我可以将右值传递给引用版本:

func(10);
func(func(func(10)));

指针版本无法做到这一点。

【讨论】:

  • 是否需要 const 部分?我以为它只是为了安全?
  • @user803253:如果你认为好的设计是必要的,这是必要的,我也这样做。不,这不仅仅是为了安全。它还允许您将实际的 const 对象传递给函数。为什么用户不能将 const 对象传递给不修改传递对象的函数?就像我说的那样,不允许用户这样做是糟糕的设计。
  • 我明白了,谢谢您的意见
  • 我不会说错的。我会说他们可以改进。
  • @Alex:我会说错。当一项改进只需要很少的努力并且没有明显的缺点时,不去做就是错误的。
【解决方案3】:

指针更灵活,也可以在声明中预定义如下:

 int func2(int *a = nullptr);

这在您的简单情况下不起作用,但在许多其他情况下却起作用。

指针也可以更容易地用于其他事情,例如存储在列表中、打字和其他事情。

是的,不能重新分配引用。

【讨论】:

    【解决方案4】:

    如果 a 是重载标准 C++ 运算符(例如 operator[] 或 operator*)的对象,客户端可以在更标准的 C++ 语法中使用它,例如 a[i],而不是 a->operator[](i) 或(*a)[i]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2017-08-26
      • 2014-08-28
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多