参考相关的问题在C++

问题描述:

在 “C++程序设计语言”,还有一个例子参考相关的问题在C++

void g() 
{ 
    int ii = 0; 
    int& rr = ii; 
    rr++; 
    int* pp = &rr; 
} 

笔者指出:

这是合法的,但RR ++不增加引用RR ,而是,++应用于碰巧是ii的int。

我对这句话很混淆,为什么“rr ++不增加引用rr”?所以rr只是作为“桥梁”来增加ii?

+0

的引用不是指针。您无法修改参考,您可以修改存储在参考内存中的值。 –

+1

我觉得作者的评论非常混乱。只要认识到'rr'本身不是一个对象,而只是另一个预先存在的对象的替代名称。所以操作**不能在'rr'本身执行,而是在它所指向的* other *对象上执行。在这种情况下,'rr ++;'和'ii ++;'的效果是一样的。 –

+2

说'rr'是另一个预先存在对象的替代名称,因为它不适合工作方式,所以IMO更令人困惑。引用不是别名,但它是它自己的实体。例如'int&r = * new int;删除&r;'在这之后,'r'仍然存在,它引用的对象不再存在。参考*具有*名称,它本身不是名称。 –

引用类似于取消引用的变量指针。例如:

int v = 3; 
int* pv = &v; 
int& rv = v; 

// Access v through a pointer: 
*pv = 4; 

// Access v through a reference: 
rv = 4; 

在这个例子中,这两个语句将设置v至4

所以rr只是作为“桥”来增加ii?

没错。在内部,它将存储地址ii,编译器将在此地址处增加int。可用于例如:

int left, right; 
... 
int &direction = random_bool() ? left : right; 
++direction; // would change left or right, depending on random_bool() 

但主要用于函数参数和返回类型。

+2

我很怀疑内部会有地址。相反,编译器会发出会直接增加'ii'值的代码。 –

+1

@KonradRudolph:没有优化的gcc肯定会将地址存储在堆栈中并使用它。说编译器可能会优化它是毫无意义的 - 它可以,但它可能会平等地对待指针,它可以优化增量(将'ii'初始分配为1而不是0),它甚至可以完全消除“ii”变量。一个好的优化编译器肯定会做所有这些,把'g()'变成一个无操作。但是,这并没有提到引用的行为。 – jpalecek

它递增ii,它不增加rr中包含的地址。

是的,在C++中,引用不过是一个别名,或者像你所说的“桥梁”。任何时候你说rr,它是就好像你说的iirr引用的变量的“原始”名称。

这与许多其他语言中的引用不同(其行为更像C++的指针)。在C++中,引用不是对象,它们没有单独的标识。你不能说“请增加”,或者“请指向空”或其他任何内容。它只是成为参考指向的变量的另一个名称。