C++在引用,对象和指针之间的区别

ami*_*cht 15 c++ oop pointers reference

这是来自OOP高级课程考试的问题,用C++教授(在TAU大学,本学期):

问:C++指针和引用有什么区别?

A.  A reference is the entire object while a pointer is only the address of it.
B.  The same meaning, and difference is only in syntax and usage.
C.  The syntax used to access the object.
D.  Pointers are simple address to the object while a reference uses the virtual table.

哪个是正确的答案?

课程老师声称A是正确的,并且对象的引用实际上是对象本身.那是对的吗?我意识到访问引用等同于访问对象本身,但是,在破坏引用时,我们不会破坏对象本身.引用是对象的替代名称,但是说reference == object true?

顺便说一句,讲师给了一个faq的以下链接作为对他的主张的支持,引用:

"重要提示:尽管引用通常是使用底层汇编语言中的地址实现的,但请不要将引用视为指向对象的滑稽指针.引用是对象.它不是指向对象的指针,也不是对象的副本.这是对象."

但是,我认为这是不正确的.

Pet*_*der 37

他们都错了.

参考本质上是另一对象的同义词.在内部,它通常被实现为指针,但它的语法就像它引用的对象一样.

指针是一个单独的对象,其存储它指向的对象的存储器地址(或0,如果它不指向对象).

可以说引用是它引用的对象(它当然就是这样),但事实并非如此.如果引用超出范围,则它引用的对象不会被破坏,因此引用不是对象.

  • 此外,引用的静态类型与对象的静态类型不同. (7认同)

Mic*_*urr 7

引用和对象之间存在区别 - 您可以对同一对象进行多次引用.对象具有"标识",而引用本身并不是真实的.

虽然引用的机制与指针的机制完全不同,但我从概念上说,引用实际上与指针非常相似.

  • 澄清:对象的"身份"是它的地址.您可以在引用上使用address(of"&")运算符,但是您获取其引用的地址,而不是引用本身的地址.因此,引用没有与它们引用的对象不同的身份. (4认同)

Ben*_*igt 5

(B)是最接近的,但仍然不完全正确.引用是const指针的语法糖.就像一个const指针一样,它必须在初始化时绑定到左值,并且永远不会被反弹.就像一个const指针,它是多态的.

编辑:(A)不正确的简短证明,因为至少有几个人在为它辩护:

struct A { int x; int f() { return 1; } }
struct B : public A { int y; int f() { return 2; } }

B b;
A& a = b;

assert(sizeof(a) == sizeof(b)); // fail
assert(a.f() == b.f()); // fail again
Run Code Online (Sandbox Code Playgroud)

  • 但与const指针不同,它不能绑定到NULL. (3认同)
  • @Ben Voigt:有时(很多次)编译器必须使用指针来实现引用语义.但是,你过于概括了.引用的*含义*(它们的语义)意味着编译器可以完全不同于指针处理它们.这个答案过分依赖于实现细节的一个子集. (2认同)
  • 在动态多态的情况下,引用在各种函数之间传递,它们确实被视为指针。然而,这并不是我们唯一一次在语言中使用引用。一些模板技术在很大程度上依赖于这样一个事实,即在编译期间引用可以被折叠为空。还有一些其他用途,编译器可以执行优化,否则使用指针是不可能的。 (2认同)
  • @Sig未定义,因为取消引用空指针始终是未定义的行为. (2认同)
  • @Cogwheel:如果你没有获取非易失性指针(或任何其他非易失性变量)的地址,它也可以被优化掉.实际上,引用引入的未命名本地变量使得引用的优化比const指针更难. (2认同)