可能重复:
What are the differences between pointer variable and reference variable in C++?
Class& c ++中的含义是什么?它与Class *有什么不同?
Class& foo;
Class* foo;
答案 0 :(得分:20)
& version表示引用,而* version表示指针。对于典型的SO帖子而言,差异太大了。我建议你从C ++ FAQ lite开始
http://www.parashift.com/c++-faq-lite/references.html
我通常不喜欢用“你应该使用谷歌”答案来回答帖子。然而,这是我强烈建议你google的一个主题。特别是谷歌“c ++指针与参考”。关于这个主题有大量的信息,这些页面的讨论将胜过我们在这里写的任何内容。
答案 1 :(得分:6)
*是一个指针,&是一个参考。两者之间的区别在于指针是必须被解除引用的存储区域,例如。通过 - >运算符,以便“被视为”一个类实例。引用是“别名”,只是同一个类实例的替代名称。您不需要使用 - >运营商参考。您使用点运算符。
就个人而言,我很少使用引用,主要是当我有一个我在堆栈上分配的值对象时。 new运算符始终返回一个指针,然后您必须取消引用该指针。此外,引用中最棘手的问题之一是您不能将它们设置为NULL。在某些情况下,拥有一个接受对象指针或NULL的函数是很方便的。如果函数接受引用,则不能传递NULL(但是可以使用Null对象模式)
答案 2 :(得分:5)
Class *可以指向任何类对象,或者没有。
A&Class;始终指向恰好一个类对象,并且永远不会指向另一个
。此外,我相信Bjarne是那些声称“C中的数组无法修复”的人中的一员,类*可以指向类的整个ding-dang 数组对象,在记忆中一个接一个地排列,并且在C中绝对没有办法判断一个Class *是指一个还是多个。
答案 3 :(得分:0)
另一个区别是必须初始化参考变量。您无法像示例代码中显示的那样创建引用变量。这会产生编译错误。
答案 4 :(得分:0)
引用(&)与指针(*)相同,只是C ++编译器确保它不为NULL。但是,它仍然可以是一个悬空指针(一个没有引用的指针变量,使得它是垃圾并且无效)。
答案 5 :(得分:0)
如上所述,你应该谷歌,但为了避免误解:
将Reference视为分配给它的术语的快捷方式。
答案 6 :(得分:0)
我将提供的另一个提示如下:
尽可能使用引用,必要时使用指针。如果保证对象存在,则应该使用引用。如果不是,那么你可能不得不使用指针。
另一个优点是引用消除了对所有权的歧义。一旦维护程序员看到一个指针,他们就会开始怀疑他们是否应该删除它。
检查这个例子:
// Wrapper class using a reference because the wrapped object always exists class Wrapper { public: // If the wrapped is guaranteed to exist at creation, do it this way Wrapper(Wrapped& wrapped):_wrapped(wrapped) { /* empty */ } // put extra methods here. int getWrappedValue() const { return _wrapped.getValue(); } private: Wrapped& _wrapped; // This object always exists and is valid }; // Wrapper class written to support a possibly non-existent wrapped object. class Wrapper { public: Wrapper(Wrapped* wrapped = 0):_wrapped(wrapped) { /* empty */ void setWrappee(WRappee* wrapped) { _wrapped = wrapped; } int getWrappedValue() const; // Not making inline -- more complex private: Wrapped* _wrapped; // Always check pointer before use }; int Wrapper::getWrappedValue() const { if (_wrapped) { return _wrapped->getValue(); } else { return -1; // NOTE, this is a contrived example -- not getting into exceptions } }