1

b の値が 100 未満になると思っていたのに、12 になってしまいました。どうしてですか? 明らかに、私のc = b行は b のエイリアスとして c を割り当てていませんか?

#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(したがって、 にも代入します) 。ab

に代入100するとcbしたがって変更されないため、12印刷時の元の値のままです。

この FAQ の質問を参照してください。

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はタイプの左辺値であるintため、それに割り当てると、の値がその時点でbの値に変更されます。(クラス型オブジェクトの場合、これはコピー代入演算子を呼び出します。)ab
  4. bは値12を持っているので、この値をに与えますa

以上です。c何が参照されているかについては何も変わりません。以前はa以前でしたが、aその後はa現在だけ異なる値になっています。


どうやらあなたはそれが参照するように再装着したいと思います。ええと、C ++参照ではそれを行うことはできません、そしてIMOこれは良いことです。しかし、あなたはポインタでそれを行うことができます:cb

#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 に答える