flat7th

memo/20120828

created 2012-08-28 modified 2012-08-28 

ウソあり注意

C++ の 参照型って一体何なのさ?


void func(Hoge& hoge) { ... }

C++の 参照型 とは何なのか:
  • 内部動作はポインタ
  • ただしNullが入らない
  • 字面上はポインタじゃない変数のように扱う
という認識で大体OK。


参照型ではポリモーフィズムはできない。

→なんで?

→C++言語の設計ポリシーに
> C++は、コストがかかることは、するのかしないのか、いつするのか、プログラマが選べる言語とする
があり、
> ポリモーフィズムは仮想関数テーブルを引くというコストがかかる。
> やりたい場合はポインタ表記のシンタックスを使う(ことでプログラマが明示可能とする)
と、決めたから。

変数.メンバ関数(); //単なるデータ抽象プログラミング
参照型変数.メンバ関数(); //単なるデータ抽象プログラミング(ただしメモリ実体の場所は外部から指定可能)
ポインタ変数->メンバ関数(); //ポリモーフィズム(=必ず仮想関数テーブルを引け、というプログラマからC++言語系への指示)

と、認識しています。私は。

根拠はスタンレーリップマン氏「C++オブジェクトモデル」。

(C++ では「メソッド」というのはなくて「メンバ関数」「静的メンバ関数」と呼ぶのが正しいです)




で、C++11 では
右辺値参照
というのが増えて
Hoge&& hoge;
と書くそうな。

現実的な使い方をお勉強中&脳ミソ再構築中です。



と、書いたのですが、「ポリモーフィズムできます」と突っ込みを頂きました。

もちょっと確認します。orz




確認しました!


参照は、多相性に関してはポインタと同じです!

すいません。ウソつきました。

ということで正しいことを書くと...


C++言語の設計ポリシーに
C++は、コストがかかることは、するのかしないのか、いつするのか、プログラマが選べる言語とする
があり、
ポリモーフィズムは仮想関数テーブルを引くというコストがかかる。
やりたい場合はポインタ表記 または参照表記 のシンタックスを使う(ことでプログラマが明示可能とする)
と、決めた。

変数.メンバ関数();           //多相性をサポートしない
参照型の変数.メンバ関数();   //多相性をサポートする
ポインタ変数->メンバ関数();  //多相性をサポートする



ならウソではないですね。
多相性に関してはポインタによる表記と参照による表記は同じですね。


以下、私が間違って記憶していた情報を正確な情報で訂正するために必要な範囲で引用。
スタンレーリップマン氏「C++オブジェクトモデル」














19ページ、21ページ、26ページに明記されています。
一体なぜ勘違いしてしまったのか謎ですが…


ということで。ごめんなさい。

// AKIRAさん、タイムリーツッコミ(適時指摘)ありがとうございました。