参考lhs和rhs在C ++中的差异

时间:2009-10-05 23:29:14

标签: c++ reference

我正在学习C ++,我发现当参考文献位于右侧时,可能会有两种情况。假设我有一个方法:

int& GetMe(int& i) { return i; }

我有:

(1)int j; GetMe(j) = GetMe(i);

(2)int& k = GetMe(i);

(1)和(2)的后果是不同的。在(1)中,语义是将i的值复制到jij的地址保持不变。更改i根本不会影响j。实际上,当您重载索引运算符[]并使用索引运算符进行赋值时就是这种情况。在(2)中,语义是创建i作为k的指示对象。 k的地址与i的地址相同,更改i会影响k

那为什么我们有差异呢?我认为,在C ++中,引用的地址只确定一次。一旦确定了引用的地址,就不能在以后更改它。在(1)中,j的引用之前已确定,因此操作是将值从i复制到j。在(2)中,k的引用被声明并初始化,因此使用i的引用来完成。所以动作是参考初始化。

我没有找到明确说明上述内容的材料,所以我想要确认。任何人都知道C ++中的参考资料必须能帮助我或指出我清楚材料。非常感谢你的进步。

3 个答案:

答案 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)

不同之处在于,在第二个示例中,您正在定义引用,在第一个示例中,您将分配给现有引用。