C ++中的引用和普通变量句柄有什么区别?

时间:2009-09-11 08:49:00

标签: c++

如果是C ++,如果我写:

int i = 0;
int& r = i;

那么ir完全相同吗?

8 个答案:

答案 0 :(得分:5)

这意味着r是i的另​​一个名字。它们都会引用相同的变量。这意味着如果你写(在你的代码之后):

r = 5;

然后i将为5。

答案 1 :(得分:3)

参考是对象的别名。即对象的替代名称。阅读本文以获取更多信息 - http://www.parashift.com/c++-faq-lite/references.html

答案 2 :(得分:2)

引用是现有对象的别名。

答案 3 :(得分:1)

是的 - 一个引用应该被认为是变量的别名,这就是为什么你不能重新分配它们就像你可以重新分配指针一样(也意味着,即使在一个非优化的编译器,你不会占用任何额外的存储空间。)

在函数参数之外使用时,引用主要用作非常好的> deep-> nested.structures->和.fields的缩写:)

答案 4 :(得分:1)

  

C ++引用与指针不同   几个基本方法:

     
      
  • 无法直接引用参考对象   在定义之后;任何出现的名称都直接指的是   它引用的对象。
  •   
  • 创建参考后,以后无法参考   另一个对象;它不能重新安置。这通常用指针完成。
  •   
  • 引用不能为null,而指针可以为;每一个参考   是指某个对象,尽管它可能有效也可能无效。
  •   
  • 参考文献不能未初始化。因为不可能重新初始化   参考,它们必须在创建后立即初始化。特别是,必须在定义它们的地方初始化局部变量和全局变量,并且必须在类的构造函数的初始化列表中初始化作为类实例的数据成员的引用。
  •   

来自Here

答案 5 :(得分:1)

语法int& r = i;创建另一个名称,即r代表变量i。因此我们说r是对i的引用。如果你访问r的值,那么r = 0. 记住参考是一个直接连接,因为它只是相同内存位置的另一个名称。

答案 6 :(得分:1)

引用略有不同,但对于大多数意图和目的,它在声明后使用相同。

与引用的行为略有不同,让我试着解释一下。

在你的例子中,'i'代表一段记忆。 '我'拥有那块内存 - 编译器在声明'i'时保留它,并且当'i'超出范围时它不再有效(并且在类的情况下它被销毁)。

然而'r'并不拥有它自己的内存,它代表与'i'相同的内存。声明它时没有为它保留内存,当它超出范围时它不会导致内存无效,如果'r'是一个类,它也不会调用析构函数。如果'i'以某种方式超出范围并在'r'不被破坏时被破坏,'r'将不再代表有效的内存。

例如:

class foo
{
public:
  int& r;
  foo(int& i) : r(i) {};
}

void bar()
{
  foo* pFoo;

  if(true)
  {
    int i=0;
    pFoo = new foo(i);
  }

  pFoo->r=1; // r no longer refers to valid memory
}

这可能看起来很人为,但如果你粗心大意的话,你可以通过对象工厂模式轻松地得到类似的东西。

我更喜欢将引用视为在创建和销毁期间与指针最相似,并且在使用过程中大多数类似于普通变量类型。

还有其他一些带有引用的小问题,但IMO这是一个很大的问题。

答案 7 :(得分:0)

您在此处编写定义,并进行初始化。这意味着你正在引用这样的代码:

void foo() {
    int i = 0;
    int& r = i;
}

但不是

class bar {
    int m_i;
    int& m_r;
    bar() : i(0), r(i) { }
};

区别很重要。例如,您可以谈论m_i和m_r对sizeof(bar)的影响,但没有等效的sizeof(foo)

现在,在使用ir时,您可以区分几种不同的情况:

  • 阅读,即int anotherInt = r;
  • 写作,即r = 5
  • 传递给int的函数,即void baz(int); baz(r);
  • 传递给int&的函数,即void baz(int&); baz(r);
  • 模板参数推断,即template<typename T> void baz(T); baz(r);
  • 作为sizeof的论据,即sizeof(r)

在这些情况下,它们是相同的。但有一个非常重要的区别:

std::string s = std::string("hello");
std::string const& cr = std::string("world");

引用延长了它所绑定的临时值的生命周期,但第一行使其成为副本。