0

今日、レファレンスを操作しているときに非常に奇妙なことがわかりました。

簡単な例:

#include <iostream>

struct Base {
  enum Type {
    FOO = 0,
    BAR = 1
  };
  virtual ~Base() {}
  virtual Type type() const = 0;
  int value_;
};

struct Foo : Base { 
    Foo() { value_ = 33; }
    virtual Type type() const { return FOO; }
};

struct Bar : Base { 
    Bar() { value_ = 44; }
    virtual Type type() const { return BAR; }
};

int main() {
    Foo foo;
    Bar bar;
    Base & b = foo;
    std::cout << b.type() << ", " << b.value_ << "\n";
    b = bar;
    std::cout << b.type() << ", " << b.value_ << "\n";
    return 0;
}

出力はどうなると思いましたか?それを見て本当に驚いた:

0, 33
0, 44

VS 2010、mingw 4.6、gcc4.3でテスト済み。それで、この魔法の秘密を知っているかもしれませんか?

イデオネリンクの例

4

2 に答える 2

7

参照はC++のポインターに似ていますが、2つの重要な例外があります(構文は別として)。

  • それらをnullに割り当てることはできません
  • 再割り当てすることはできません

したがって、を呼び出すときb = barは、参照を再割り当てしていません。;barによって参照されるオブジェクトにの値を割り当てています。bこの場合、の値をに割り当てていbarますfoo。したがって、2行目には、のが付いたFooオブジェクトがvalue_あり44ます。ちょうどあなたの出力が言うこと。

于 2013-01-09T13:04:12.183 に答える
3

=とは異なる操作ですBase & b = foo;b = bar;

Base & b = foo;参照をに割り当てますfoo

b = bar;のデフォルトのメンバーごとの割り当てを試みますBasebまだ参照していfooます。そのメンバーは再割り当てされました。それはまだタイプFooです。

一般的なコーディング標準(Googleなど)では、デフォルトのコピーコンストラクタと割り当てを非公開にすることで取り消す必要があることがよくあります。

于 2013-01-09T13:04:12.777 に答える