--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2009/06/05

C++ の参照

C++の場合、リファレンスは初期化時のみ参照先の指定が可能で、 以降、参照先を変えることはできません。(ご存知の通り、)ポインタは アドレスの再代入により何度でも参照先を変えることができます。 既にポインタがあるので、リファレンスに上記のような制限が加えられて いるのだと解釈しています。

Ruby(Java)とC++のリファレンス(参照)の違い - エンジニア&Rubyistの徒然なるままに

できると思うんだけど。

#include <iostream>

class Foo {
    int x_;
public:
    explicit Foo(int x) : x_(x) { }
    int val() { return x_; }
};

int main(int argc, char** argv) {
    using namespace std;

    Foo f(1);
    Foo& fr = f;
    cout << fr.val() << endl;

    Foo g(2);
    fr = g;
    cout << fr.val() << endl;

    // fr = 0; // 無理

    return 0;
}

無理ってコメント入れてる行はコンパイルエラーになる。C++ のリファレンスは実体ありきだから、ポインタみたいに NULL ポインタを指させるようなことはできない。ポインタは "ある型の実体を指すアドレス値の型" だから、アドレスの代入によっていくらでも参照先を替えることができる。と思う。

スポンサーサイト

comment

by bleis-tift : 2009/06/05 11:07
はじめまして。
C++ で参照が一回しか設定出来ないというのは、
fr = g;
を行ったとしても fr は f である、ということです。
以下のコードを実行すればどういうことか分かるでしょう。

#include <iostream>

struct hoge
{
  int x;
  hoge(int x) : x(x) {}
};

int main()
{
  hoge h = 1;
  hoge& hr = h;
  std::cout << hr.x << std::endl;

  hoge h2 = 2;
  hr = h2;
  std::cout << hr.x << std::endl;
  std::cout << h.x << std::endl;

  h2.x = 0;
  std::cout << hr.x << std::endl;
  std::cout << h.x << std::endl;
}
by talo : 2009/06/05 15:55
なるほどー。ありがとうございました。
post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。