在C++中,使用引用而不是指针有什么优势吗?

7

可能是重复问题:
C++中指针变量和引用变量的区别是什么?

例如,我有两个执行相同操作的函数:

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

and

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

使用func而不是func2有什么优势,当调用这些函数时?

在我看来,唯一的优点就是能够接受空参数。这个主题已经有一些很好的问题在这里了。 - chris
3
在C++中,指针变量和引用变量都可以让你间接地访问其他变量。不同之处在于,指针是一个独立的实体,而引用只是目标变量的别名。这意味着指针可以被重新分配到另一个变量,而引用总是与其目标绑定,并且不能更改绑定。此外,指针可以为空,而引用不能为NULL。 - jedwards
我之所以问这个问题,是因为我们小组项目中的一个朋友坚持要求我们使用引用而不是指针,并声称引用比指针“优越”。既然我在做了一些C项目后更加习惯于使用指针,那我想我还是会坚持使用指针。 - Kang Min Yoo
3
是的,每当您能够使用它们时,引用是更好的选择 -- 它们比指针产生更少的错误。 - Billy ONeal
@BillyONeal,如果您能够熟练掌握指针,那就不用这么担心了吧? - Kang Min Yoo
1
@user803253:这不是能否很好地管理指针的问题,而是要防止每个人都会犯的“愚蠢”错误。例如,将空指针传递给需要数据指针的函数。如果编译器可以为您捕获错误,为什么不利用这一事实呢? - Billy ONeal
4个回答

12
  • 一个引用无法直接分配为 null,但指针可以。
  • 一个引用无法重新分配指向其他东西,但指针可以。

这两者都可能是优点或缺点,具体情况而定。


3
如果我没记错的话,构造一个null引用是未定义行为。 - Sergey Kalinichenko
2
只有在格式错误的程序中,引用才可能是“NULL”,因此基本上可以说它们不可能是“NULL”。 - Seth Carnegie
2
@Kaz 的意思是它是指针的语法糖。 - Seth Carnegie
1
@MarkRansom 是的,但是在我们定义什么可以做和不能做的时候,将未定义的行为包含在格式错误的程序中是毫无意义的。因此,引用不能为 NULL,因为标准是这样规定的,任何其他行为都超出了宇宙的范围。你不这么认为吗? - Seth Carnegie
2
@SethCarnegie,我的态度受到了一个多天的调试会话的影响,这是由于一个被证明为空的引用所引起的。而且这甚至不是我的代码! - Mark Ransom
显示剩余7条评论

2

你的两个函数都是错误的。因为它们不修改传入的参数,所以应该将它们作为const参数传递,像这样:

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

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

现在有个引用的优势,我可以将rvalue传递到引用版本中:
func(10);
func(func(func(10)));

我无法使用指针版本完成此操作。

const部分是必要的吗?我认为它只是为了安全起见才存在的? - Kang Min Yoo
2
如果你认为良好的设计是必要的,那么这就是必要的,而我认为它是必要的。这不仅仅是为了安全。它还允许你将实际的const对象传递到函数中。为什么用户不能将const对象传递到不修改传递对象的函数中呢?不允许用户这样做就像我说的那样,是不好的设计。 - Benjamin Lindley
2
我不会说是错的,我会说它们可以被改进。 - Alexey Frunze
1
@Alex:我认为你错了。当一项改进所需的努力很少且没有明显的缺点时,不去实施它是错误的。 - Benjamin Lindley

1
指针更加灵活,它也可以在声明中预定义,例如:
 int func2(int *a = nullptr);

在您的简单情况下可能不起作用,但在许多其他情况下会起作用。

指针也可以更容易地用于其他事情,比如存储在列表中、类型转换等等。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接