关于C++:引用与指针的区别

Difference between references and pointers

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What are the differences between pointer variable and reference variable in C++?

C++中的类和AMP是什么意思,它与类*有什么不同?

1
2
Class& foo;
Class* foo;


&version表示引用,*version表示指针。对于一个典型的SO帖子来说,这个差异太大了。我建议你从C++ FAQ Lite开始

http://www. PARASIFIF.COM/C++-FAQLIT/RealthCys.HTML

我通常不喜欢用"你应该使用谷歌"的答案来回答帖子。然而,这是一个我强烈建议你谷歌的话题。特别是谷歌"C++指针与参考文献"。关于这个主题有很多信息,这些页面上的讨论将胜过我们在这里写的任何内容。


*是指针,&;是引用。两者之间的区别在于指针是一个必须被取消引用的内存区域,例如,为了被"视为"类实例,"通过"-->操作符"。引用是一个"别名",只是同一个类实例的另一个名称。您不需要在引用中使用->operator。使用点运算符。

就个人而言,我很少使用引用,主要是在我在堆栈上分配了一个值对象时。新的运算符总是返回一个指针,然后您必须取消对该指针的引用。此外,引用的一个最有问题的问题是不能将其设置为空。在某些情况下,使用接受对象指针或空值的函数很方便。如果函数接受引用,则不能传递空值(但是可以使用空对象模式)


类*可以指向任何类对象,也可以不指向任何类对象。

类总是指向一个类对象,并且永远不能指向另一个类对象。

此外,我相信bjarne是断言"C中的数组是无法修复的",一个类*可以指向一个完整的类对象的丁当数组,在内存中一个接一个地排列,而且C中绝对没有办法分辨一个类*是指向一个还是多个。


我将提供的另一个提示是:

尽可能使用引用,必要时使用指针。如果保证对象存在,那么您可能应该使用引用。如果不是,那么您可能需要使用指针。

另一个好处是引用消除了所有权上的模糊性。维护程序员一看到指针,就会开始怀疑是否应该删除它。

看看这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 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
  }
}

如前所述,你应该谷歌搜索它,但为了避免误解:

  • 引用不是变量
  • 引用与指针不相似(但可以以类似的方式使用它们)

将引用视为指定术语的快捷方式。


引用(&)与指针(*)相同,只是C++编译器确保它不是空的。但是,它仍然可以是悬空指针(指针变量没有引用,因此它是垃圾,对任何使用都无效)。


另一个区别是必须初始化引用变量。不能创建类似于示例代码中所示的引用变量。这将产生一个编译器错误。