引用和指针之间的区别

时间:2009-04-14 00:16:29

标签: c++ pointers reference

  

可能重复:
  What are the differences between pointer variable and reference variable in C++?

Class& c ++中的含义是什么?它与Class *有什么不同?

Class& foo;
Class* foo;

7 个答案:

答案 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
  }
}