这些是一样的吗:
int foo(bar* p) {
return p->someInt();
}
和
int foo(bar& r) {
return r.someInt();
}
忽略空指针电位。这两个函数在功能上是否相同,无论someInt()
是虚拟的还是传递给bar
的子类bar
?
这个切片什么吗?
bar& ref = *ptr_to_bar;
Answers:
有意在标准中未指定使用指针实现C ++引用。引用更像是变量的“同义词”,而不是指向变量的指针。当有可能意识到指针在某些情况下会显得过大时,这种语义为编译器带来了一些可能的优化。
还有一些区别:
忽略可以用一个而不是另一个完成的所有语法和可能性,以及在其他答案(针对其他问题)中解释的指针和引用之间的区别...是的,这两个函数在功能上完全相同!两者都调用该函数,并且均能很好地处理虚函数。
不,您的线不会切开。它只是将引用直接绑定到指针所指向的对象。
有关为什么要在另一个上使用的一些问题:
我没有亲自提出分歧,而是委托您参加那些您想知道的事情。
正如其他所有人所提到的,在实现中,引用和指针在很大程度上是相同的。有一些小警告:
您不能将NULL分配给引用(shoosh提到了这一点):这很重要,因为没有“未定义”或“无效”的引用值。
您可以将临时变量作为const引用传递,但是将指针传递给临时变量是不合法的。
例如,这可以:
class Thingy; // assume a constructor Thingy(int,int)
void foo(const Thingy &a)
{
a.DoSomething();
}
void bar( )
{
foo( Thingy(1,2) );
}
但是大多数编译器会抱怨
void foo2( Thingy * a);
void bar2()
{
foo( &Thingy(1,2) );
}
void foo()
{
int a = 5;
// this may be slightly more efficient
int &b = a;
printf( "%d", ++b );
// than this
int *c = &a;
printf( "%d", ++(*c) );
}
同样,__ restrict关键字不能应用于引用,只能应用于指针。
您不能对引用进行指针算术运算,因此,如果您有一个指向数组的指针,则数组中的下一个元素可以通过p + 1拥有,而引用只能在其整个生命中指向一件事。
这些功能显然不是“相同的”,但就虚拟行为而言,它们的行为将相似。关于切片,仅当您处理值而不是引用或指针时,才会发生这种情况。