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++引用.引用更像是变量的"同义词"而不是指向它的指针.当有可能在某些情况下意识到指针过大时,这种语义会为编译器打开一些可能的优化.
还有一些差异:
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)
是的,它们在功能上是相同的.由于引用将要求您在使用它之前将其设置为对象,因此您不必处理空指针或指向无效内存的指针.
看到语义差异也很重要: