1

我期望 b 的值低于 100,但我得到 12。为什么会这样?显然,我的c = b行没有将 c 指定为 b 的别名?

#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 4;
    int b = 12;
    int& c = a;

    c = 8;

    cout << a << endl;
    c = b;
    c = 100;

    cout << b << endl;


    int bb;
    cin >> bb;
    return 0;
}
4

3 回答 3

7

显然,我的c = b线路没有指定cb?

确切地说,引用不能在 C++ 中重新定位。c将始终是对a.

c = b只是一个简单的任务。

于 2013-01-13T21:02:20.723 回答
6

您不能重新设置引用-您的c = b;行只是分配给c(因此也分配给a) 的当前值b

当您然后分配100给 时cb因此不会改变,因此它仍然具有12您打印出来时的原始值。

请参阅此常见问题解答:

http://www.parashift.com/c++-faq/reseating-refs.html

于 2013-01-13T21:02:33.543 回答
2

c = b实际上执行以下操作:

  1. c是对 的引用a,因此我们请求的任何操作都c将实际执行a
  2. 我们分配给c- 这意味着,通过 1.,我们实际上必须分配给a
  3. a是 type 的左值int,因此分配b给它会将 的值更改为当时具有的a任何值b。(对于类类型对象,这将调用复制赋值运算符。)
  4. b有值12,所以我们把这个值赋给a

就是这样。关于所指的东西没有任何改变c:它a以前是,a后来是,只是a现在有不同的价值。


显然您重新安装c,以便它引用b. 好吧,你不能用 C++ 引用来做到这一点,而 IMO 这是一件好事。但是你可以用指针来做到这一点:

#include <iostream>

int main() {
    int a = 4;
    int b = 12;
    int* c = &a;

    *c = 8;

    std::cout << a << std::endl;
    c = &b;
    *c = 100;

    std::cout << b << std::endl;

    return 0;
}

将输出您对程序的期望。

于 2013-01-13T21:09:57.087 回答