我在一些很好的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做同样的事情。
是吗?但为什么需要别名?
答案 0 :(得分:3)
然后无论你做什么参考,对a。
也是如此
这是一个非常准确的方式来看待它。从本质上讲,ref
和a
都指的是同一个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
个对象的别名。可以使用a
或ref
对对象进行更改,但只有一个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'
}
如果没有参考,这也是一种痛苦(并且容易出错)。