指针和参考参数之间的区别?

cri*_*ell 64 c++ pointers reference object-slicing

这些都是一样的:

int foo(bar* p) {
  return p->someInt();
}
Run Code Online (Sandbox Code Playgroud)

int foo(bar& r) {
  return r.someInt();
}
Run Code Online (Sandbox Code Playgroud)

忽略空指针潜力.这两个函数在功能上是否相同,无论它们someInt()是虚拟的还是传递给它们bar的子类bar

这会切片吗:

bar& ref = *ptr_to_bar;
Run Code Online (Sandbox Code Playgroud)

sho*_*osh 65

有意在未使用指针实现的标准中指定C++引用.引用更像是变量的"同义词"而不是指向它的指针.当有可能在某些情况下意识到指针过大时,这种语义会为编译器打开一些可能的优化.

还有一些差异:

  • 您不能为引用分配NULL.这是一个至关重要的区别,也是你偏爱另一个的主要原因.
  • 获取指针的地址时,将获得指针变量的地址.获取引用的地址时,将获得所引用变量的地址.
  • 您无法重新分配参考.一旦初始化,它指向其整个生命中的同一个对象.

  • 实际上,您可以将NULL分配给引用,如果将其转换为类型的指针,然后取消引用该点,例如int&ref =*(int*)NULL; 如果将引用放在并集中并更改联合中的相应值,也可以重新分配引用. (6认同)
  • 我应该补充一点,这些永远不应该完成,因为当函数请求引用时,它永远不会期望 NULL,尽管大多数引用基本上以与指针相同的方式实现,但在所有情况下可能并非如此/平台。 (2认同)
  • 如果您要分配给联合的相应值,那么您并没有真正分配给引用,是吗? (2认同)

Joh*_*itb 15

忽略每个语法糖和可以用一个而不是另一个完成的可能性以及指针和参考之间的差异在其他答案中解释(对于其他问题)......是的,这两个在功能上是完全相同的!两者都调用该函数并同时处理虚函数.

不,你的线不会切片.它只是将引用直接绑定到指针指向的对象.

关于为什么要使用一个而不是另一个的一些问题:

我不会自己想出差异,而是将你委托给那些你想知道的人.


Vin*_*nay 13

引用是一个常量指针即,您无法更改引用以引用其他对象.如果更改,引用对象的值将更改.

对于Ex:

       int j = 10;
       int &i = j;
       int l = 20;
       i = l; // Now value of j = 20

       int *k = &j;
       k = &l;   // Value of j is still 10
Run Code Online (Sandbox Code Playgroud)


Pat*_*ien 6

是的,它们在功能上是相同的.由于引用将要求您在使用它之前将其设置为对象,因此您不必处理空指针或指向无效内存的指针.

看到语义差异也很重要:

  • 在实际传递对象法线时使用引用 - 但是它太大以至于传递对象的引用而不是复制(如果你没有修改对象)更有意义.
  • 当您想要处理内存地址而不是对象时,请使用指针.


Chr*_*fer 5

我很久没有使用过C++了,所以我甚至都不会尝试回答你的问题(对不起); 然而,Eric Lippert刚刚发布了一篇关于指针/参考的优秀文章,我认为我会指向你.