指针和参考参数之间的区别?
这些是一样的:
int foo(bar* p) { return p->someInt(); }
和
int foo(bar& r) { return r.someInt(); }
忽略空指针的潜力。 无论someInt()
是虚拟的还是通过一个bar
或bar
的子类,这两个函数在function上是否相同?
这是否切片什么:
bar& ref = *ptr_to_bar;
有意使用指针来实现标准中的C ++引用。 引用更像是一个variables的“同义词”,而不是一个指向它的指针。 这种语义为编译器打开了一些可能的优化,因为在某些情况下可能会意识到指针会过度杀伤。
还有一些不同之处:
- 您不能将NULL分配给引用。 这是一个关键的区别,也是你比较喜欢的主要原因。
- 当你获得一个指针的地址时,你得到了指针variables的地址。 当你把一个引用的地址,你得到被引用的variables的地址。
- 您不能重新分配参考。 一旦它被初始化,它就会在整个生命中指向同一个对象。
忽略每一个语法糖和可能的做法,而不是与其他的指针和参考之间的区别,在其他答案(对其他问题)中解释…是的,这两个在function上是完全一样的! 两者都调用函数,并同时处理虚函数。
不,你的路线不切。 它只是将引用直接绑定到指针指向的对象。
一些问题,你为什么想要使用一个:
- 指针和参考之间的区别
- 通过指针传递参考有什么好处吗?
- 指针与参考
我不会试图自己想出分歧,而是把你委托给那些以防万一你想知道的人。
引用是一个常量指针,即不能改变引用来引用其他对象。 如果更改,则引用对象的值将更改。
例如:
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
是的,他们在function上是相同的。 由于引用将要求您在使用它之前将其设置为对象,您不必处理空指针或指向无效内存的指针。
看到语义上的差异也很重要:
- 实际上传递对象时使用引用正常 – 但它是如此之大,更有意义的传递对象的引用,而不是做一个副本(如果你不修改对象)。
- 当你想处理内存地址而不是对象时使用指针。
不知道是否有人回答你的第二个问题隐藏在底部切片…不,不会导致切片。
切片是派生对象被分配(复制)到基类对象 – 派生类的专业化是“切片”closures。 请注意,我说这个对象被复制了,我们不是在讨论被复制/分配的指针,而是对象本身。
在你的例子中,这没有发生。 你只需要引用一个指向Bar对象的指针(从而生成一个Bar对象)作为引用初始化中的右值。 不知道我的术语是否正确
正如其他人所提到的,在实现中,引用和指针在很大程度上是相同的。 有一些小的警告:
-
你不能把NULL分配给引用(shoosh提到过):这是很重要的,因为没有“undefined”或“invalid”的引用值。
-
您可以传递一个临时variables作为一个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) ); }
- 取一个variables的地址来得到一个指针,强制编译器将其保存到内存中。 指定一个局部variables的引用只是创build一个同义词; 在某些情况下,这可能允许编译器将数据保存在寄存器中并避免加载存储 。 但是,这只适用于局部variables – 一旦某个东西被引用作为parameter passing,就不会避免将其保存到堆栈。
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来获得,而引用只能指向整个生命中的一件事情。
我很久没有使用C ++,所以我甚至不会试图真正回答你的问题(对不起)。 不过,Eric Lippert刚刚发表了一篇关于指针/引用的优秀文章 ,我想我会指出你的意思。
这些function显然不是“一样的”,但是在虚拟行为方面,它们的行为是相似的。 关于切片,这只发生在处理值时,而不是引用或指针。