• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【C++】アドレス演算子について質問です。)

C++アドレス演算子についての質問

このQ&Aのポイント
  • C++のアドレス演算子について質問です。センセーショナルなタイトル
  • アドレス演算子の使い方や動作に関して、特にクラスのメンバメソッドにおける挙動について疑問があります。
  • グローバルメソッドとクラスのメンバメソッドにおけるアドレスの出力結果の違いについて説明してください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

(1) 1 になる理由 std::ostream の operator<< がメンバ関数ポインタに対する overload を定義していないので、 規格 [conv.bool] の boolean conversion 規則が適用されて &Class1::f は (bool)&Class1::f に変換されます。 &Class1::f は null ではないので bool 的には true になります。 そして、ostream は true に対して 1 を出力するので、上のコードで 1 が表示されるのです。 なので、この出力に関しては処理系依存ではなくて、(規格準拠の処理系なら) 常に 1 が出力されるべきかと思います。 (2) 中身の見方 メンバ関数ポインタの「内容」を知りたければ union などを使って無理矢理 void* に変換するとか。。(規格的にはメンバポインタから通常ポインタへのキャストは定義されていません。) ------------------ union{ void (Class1::*mfp)(); void* ptr; } conv = { &Class1::f }; cout<<"&クラス::メンバ関数"<<conv.ptr<<endl; ------------------ 大体の処理系では、メンバ関数ポインタの「内容」はやはり実体のアドレスの様です。但し、「内容」が実体のアドレスなのか、或いはもっと違う種類のデータなのかは、既に回答された方のいう通り処理系依存なので、常にアドレスが得られるとは限りません。 (3) 実体はある > 2行目は実態が存在しないと思うのですが、あってますでしょうか? メンバ関数にもちゃんと関数実体があります! なかったら実行できないではありませんか…。 (3) 後、用語が気になるので… * 実態→実体 * グローバルメソッド→グローバル関数 (メソッドは普通メンバ関数の事です) * メンバメソッド→メソッド or メンバ関数 (C++ 的にはメンバ関数です)

参考URL:
http://stackoverflow.com/questions/2064692/how-to-print-function-pointers-with-cout
haraheri31
質問者

お礼

用語の説明まで大変ありがとうございました。 C++を学んでいるところなのですが、 調べれば調べる程奥深く、驚いています。 詳しいご説明感謝します。

その他の回答 (1)

回答No.1

普通の関数(この例ではFunc)へのポインタと メンバ関数へのポインタとを同列に扱ってはいけません。 メンバ関数へのポインタの中にメンバ関数のアドレスが入っているとは言えないのです。 以下のコード、Visual C++ では 1 がふたつ出力されます。 メンバ関数のアドレスが入っているとすると説明できなくなります。 #include <iostream> using namespace std; class Class1{ public: void f() {} void g() {} }; int main() { cout << "&クラス::メンバメソッド:"<< &Class1::f <<endl; cout << "&クラス::メンバメソッド:"<< &Class1::g <<endl; } ならば何が入っているか、は "コンパイラの勝手"です。 C++言語規格では"どう振る舞うか"は書かれていますが、 "どんな機械語に展開されるか"には一言も言及していません。 なので、 > 1行目はグローバルメソッドなので実態が存在するのでメソッドのアドレスが表示されている。 > 2行目は実態が存在しないと思うのですが、あってますでしょうか? > また、何故1が表示されてしまうのでしょうか? この質問自体が意味を成しません。 「コンパイラがそんな機械語を吐いたから」です。

関連するQ&A

専門家に質問してみよう