C ++独立引用 - 用于什么?

时间:2012-05-19 16:44:19

标签: c++ reference alias

我在一些很好的C ++教程中读到确实存在独立引用,并且像别名一样。但是......我想知道它是为了什么做的。为什么要使用别名。

此外,还有一些我不清楚的代码:

int a;
int &ref = a; // independent reference
int b = 19;
ref = b;  
cout << a << " " << ref << "\n";
ref--;  
cout << a << " " << ref << "\n";

首先,ref是a的'引用'。我从第二行代码中了解到ref的地址(因此ampershead)是一个。然后,为整数ref赋值b(19)。第一个cout返回a和ref,两者都等于19.为什么? ref不是整数的地址吗?然后,递减ref,最后cout给出两次18.a和ref递减。

只有奇怪的可能解释的神秘:这里int&amp;是一个类型本身,'对整数的独立引用',这种类型意味着别名。然后无论你做什么参考,对a做同样的事情。

是吗?但为什么需要别名?

6 个答案:

答案 0 :(得分:3)

  

然后无论你做什么参考,对a。

也是如此

这是一个非常准确的方式来看待它。从本质上讲,refa都指的是同一个int

  

为什么需要别名?

引用的一个非常常见的用途是将参数传递给函数。请考虑以下事项:

void f(const HugeStruct& data) {
 ...
}

这允许调用者以低廉的语法将HugeStruct传递给调用者,并且语法比使用指针时更好。

答案 1 :(得分:3)

你是对的。在许多方面,引用类似于 const 指针(例如,修改引用的值会修改原始引用),并且除了初始变量之外,您不能将引用绑定到任何其他内容,但它不能是{{ 1}}和使用它的语法也不同(不需要解除引用(null*))。因为它不是指针,所以最好的描述是别名:将它视为同一变量的不同名称。

此外,如果将引用作为函数参数传递,则不会生成变量的副本(如指针和指向的值),并且对引用的任何更改都会反映在原始变量上。

const引用还有一些特殊规则,允许临时值超出其常规生存期,直到它被绑定的const引用超出范围。

答案 2 :(得分:2)

在你的例子中没有多大意义。但请考虑一下:

int & ri = expensive_function_call(args)->some_map[calculate_the_key()].first;
if (ri > 6) ri = 6;

VS

if (expensive_function_call(args)->some_map[calculate_the_key()].first > 6)
    expensive_function_call(args)->some_map[calculate_the_key()].first = 6;

当然,您可以使用指针:

int * pi = &expensive_function_call(args)->some_map[calculate_the_key()].first;
if (*pi > 6) *pi = 6;

通过使用别名(引用或指针),不仅代码减少了一半,而且程序在运行时必须完成的工作也减少了一半(至少在编译器开始优化之前)。

答案 3 :(得分:2)

  

我从第二行代码中了解到ref的地址(因此&符号)是一个。然后,为整数引用赋值b。

我认为您不了解参考文献是如何运作的。

int a;
int &ref = a;

第一行分配int个对象。可以使用局部变量a来引用此对象。

第二行的作用是使ref成为同一int个对象的别名。可以使用aref对对象进行更改,但只有一个int对象。

答案 4 :(得分:1)

你需要学习一本关于C ++的好书并给它一个阅读,因为你的问题中存在一些基本的错误陈述。

首先,a不是ref的地址。在第一行代码中使用&运算符时: int &ref = a 您没有将ref的地址设置为a。您正在创建一个新变量,它是现有整数的别名,即对a的显式引用。这是它自己的操作符/操作,与地址或指针无关(不是真的)。​​

此后,每当您读到或写入ref时,就好像您正在写一篇文章。 ref现在是另一种说a的方式,您在其上执行的任何操作(包括尝试获取其地址)都转发a

答案 5 :(得分:1)

即使不涉及函数调用,也可以很好地使用alises。

您可以使用它来简化名称

MyComplicatedStruct x;
int &ref = x.array[17].anotherarray[3];
// Do stuff with 'ref'

每次我想要使用该整数值时,必须拼写出来是一种痛苦(并且容易出错!)。

另一个例子:

int myFirstValue = 1;
int MyOtherValue = 2;

while(true) {
    int &value = (SomeComplicatedTest() ? myFirstValue : myOtherValue);
    // do stuff with 'value'
}

如果没有参考,这也是一种痛苦(并且容易出错)。