C++ 在c+中使用引用而不是指针有什么好处吗+;?

C++ 在c+中使用引用而不是指针有什么好处吗+;?,c++,pointers,reference,C++,Pointers,Reference,可能重复: 例如,我有两个函数做同样的事情: int func(int &a) { return a+1; } 及 调用这些函数中的任何一个时,使用func比使用func2有什么好处? 引用不能直接赋值为null,但指针可以为null 不能重新分配引用以指向其他对象,但可以重新分配指针 根据具体情况,这两者可能是优点也可能是缺点。指针更灵活,也可以在声明中预定义,如: int func2(int *a = nullptr); 这在你的简单案例中不起作用,但在许多其他案例中

可能重复:

例如,我有两个函数做同样的事情:

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

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

  • 引用不能直接赋值为null,但指针可以为null
  • 不能重新分配引用以指向其他对象,但可以重新分配指针

根据具体情况,这两者可能是优点也可能是缺点。

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

 int func2(int *a = nullptr);
这在你的简单案例中不起作用,但在许多其他案例中起作用

指针还可以更容易地用于其他事情,例如存储在列表中、标记它和其他事情


是的,无法重新分配引用。

您的两个函数都是错误的。由于它们不修改传入的参数,因此应将它们作为常量接收,如下所示:

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

int func2(const int *a)
{
    return *a+1;
}
现在,引用的一个优点是,我可以将右值传递到引用版本中:

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

我不能用指针版本来做。

< P>如果A是一个重载标准C++操作符(例如,运算符[]或操作符*)的对象,客户端可以使用它像标准[i]那样的更标准的C++语法,而不是A- >运算符[](i)或(*a)[i] < /p>,在我看来,唯一的优点是能够接受空参数。关于这个话题,这里已经有一些很好的问题了。我问这个问题是因为我们小组项目中的一位朋友坚持让我们使用引用而不是指针,他声称引用比指针“优越”。我想我还是坚持使用指针吧,因为在做了一些C项目之后,我对指针有了更多的习惯。@user803253:是的,只要你能使用它们,它们都是优秀的——它们承认的错误比指针少。@user803253:这不是能够很好地管理指针的问题。这是一个防止每个人都犯“愚蠢”错误的问题。例如。如果编译器可以为您捕获错误,为什么不利用这一事实呢?@VladLazarenko如果我没有弄错,构造
null
引用是未定义的行为。@VladLazarenko只有在格式错误的程序中,引用才能
null
,所以说它们不能为
NULL
@Kaz基本上是正确的,他是说它是指针的语法糖。@Markransem是的,但将畸形程序中未定义的行为包含在我们对什么可以做和什么不能做的定义中是毫无意义的。因此,引用不能是空的,因为标准是这样规定的,任何其他行为都不属于这个范围。你不这么认为吗?@SethCarnegie,我的态度被一个被证明为空的引用所引起的多天调试过程所影响。甚至不是我的密码!常量部分是必要的吗?我想它是为了安全吗?@ USER 803253:如果你认为有必要的设计是必要的,我也是。不,这不仅仅是为了安全。它还允许您将实际的const对象传递到函数中。为什么用户不能将常量对象传递到不修改传递对象的函数中?不允许用户这样做,就像我说的,是糟糕的设计。我明白了,谢谢你的输入,我不会说错的。我认为他们可以改进。@Alex:我认为是错的。当一个改进只需要很少的努力并且没有明显的缺点时,不去做是错误的。
func(10);
func(func(func(10)));