参考相关的问题在C++
在 “C++程序设计语言”,还有一个例子参考相关的问题在C++
void g()
{
int ii = 0;
int& rr = ii;
rr++;
int* pp = &rr;
}
笔者指出:
这是合法的,但RR ++不增加引用RR ,而是,++应用于碰巧是ii的int。
我对这句话很混淆,为什么“rr ++不增加引用rr”?所以rr只是作为“桥梁”来增加ii?
引用类似于取消引用的变量指针。例如:
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()
但主要用于函数参数和返回类型。
我很怀疑内部会有地址。相反,编译器会发出会直接增加'ii'值的代码。 –
@KonradRudolph:没有优化的gcc肯定会将地址存储在堆栈中并使用它。说编译器可能会优化它是毫无意义的 - 它可以,但它可能会平等地对待指针,它可以优化增量(将'ii'初始分配为1而不是0),它甚至可以完全消除“ii”变量。一个好的优化编译器肯定会做所有这些,把'g()'变成一个无操作。但是,这并没有提到引用的行为。 – jpalecek
它递增ii
,它不增加rr
中包含的地址。
是的,在C++中,引用不过是一个别名,或者像你所说的“桥梁”。任何时候你说rr
,它是就好像你说的ii
,rr
引用的变量的“原始”名称。
这与许多其他语言中的引用不同(其行为更像C++的指针)。在C++中,引用不是对象,它们没有单独的标识。你不能说“请增加”,或者“请指向空”或其他任何内容。它只是成为参考指向的变量的另一个名称。
的引用不是指针。您无法修改参考,您可以修改存储在参考内存中的值。 –
我觉得作者的评论非常混乱。只要认识到'rr'本身不是一个对象,而只是另一个预先存在的对象的替代名称。所以操作**不能在'rr'本身执行,而是在它所指向的* other *对象上执行。在这种情况下,'rr ++;'和'ii ++;'的效果是一样的。 –
说'rr'是另一个预先存在对象的替代名称,因为它不适合工作方式,所以IMO更令人困惑。引用不是别名,但它是它自己的实体。例如'int&r = * new int;删除&r;'在这之后,'r'仍然存在,它引用的对象不再存在。参考*具有*名称,它本身不是名称。 –