我正在学习C ++,我发现当参考文献位于右侧时,可能会有两种情况。假设我有一个方法:
int& GetMe(int& i) { return i; }
我有:
(1)int j; GetMe(j) = GetMe(i);
和
(2)int& k = GetMe(i);
(1)和(2)的后果是不同的。在(1)中,语义是将i
的值复制到j
。 i
和j
的地址保持不变。更改i
根本不会影响j
。实际上,当您重载索引运算符[]并使用索引运算符进行赋值时就是这种情况。在(2)中,语义是创建i
作为k
的指示对象。 k
的地址与i
的地址相同,更改i
会影响k
。
那为什么我们有差异呢?我认为,在C ++中,引用的地址只确定一次。一旦确定了引用的地址,就不能在以后更改它。在(1)中,j
的引用之前已确定,因此操作是将值从i
复制到j
。在(2)中,k
的引用被声明并初始化,因此使用i
的引用来完成。所以动作是参考初始化。
我没有找到明确说明上述内容的材料,所以我想要确认。任何人都知道C ++中的参考资料必须能帮助我或指出我清楚材料。非常感谢你的进步。
答案 0 :(得分:5)
你在这里缺少的是变量的类型是不同的,这一切都很重要。在第一个示例中,您有int j
,第二个是int &k
。
函数原型中的引用存在于不同的理由中,它们看起来是一样的,在它们之下它们几乎相同但它们的使用方式不同,因为它们仅在方法执行时才存在。
实际上,您的代码完全符合
int j;
int & j1 = j;
int & i1 = i;
j1 = i1;
与
int & i1 = i;
int & k = i1;
很容易看出,在第一种情况下,两个引用实际上引用了不同的变量,即内存中的不同部分,但在第二种情况下,它们都引用完全相同的变量。因此存在差异。
答案 1 :(得分:3)
在案例1中,GetMe返回对j的引用,然后通过该引用为j分配值。如果2 GetMe返回对i的引用,然后您将该引用分配给另一个引用k,意味着k指向i。
引用在C ++中是不可变的(意味着你不能改变引用引用的内容,尽管你可以改变引用的值)。当在表达式的右侧使用时,引用也可以透明地替换它们所引用的内容。引用的不变性意味着1中没有歧义 - 您必须打算分配GetMe的返回值所指的内容而不是更改引用。 2中没有歧义,因为您正在为引用分配引用(您不能将int分配给对int的引用)。
答案 2 :(得分:0)
不同之处在于,在第二个示例中,您正在定义引用,在第一个示例中,您将分配给现有引用。