4

ちょっとした質問があります:)、すべてのメソッドが「密かに」内部にあるクラスの「this」ポインターを取得することを理解していますが、なぜそれが「フレンド」関数に起こらないのですか? クラスのメソッドではないからですか?

機械全体を説明できる人はいますか? 「これ」が実際にどのように機能するのか非常に興味があります!

前もって感謝します!:)

4

2 に答える 2

2
  • friend関数とクラスは、コンパイラによってチェックされるアクセス制御に使用されるだけです。
  • friend関数は単なる標準関数であるため、呼び出し規約に関する違いはありません。
  • friend関数はどのクラスのメンバーでもないため、thisポインターは渡されません (staticメンバー関数の場合と同様) 。

クラスの非staticメンバー関数は、非表示のthis ポインターを取得します (ABI によっては、これが最初の引数であることが多い)。staticメンバー関数は、インスタンス データに作用しないため、this ポインターを取得しません。

this ポインターがどの程度正確にメンバー関数に渡されるかは、使用される ABI に大きく依存します。これは、アーキテクチャとオペレーティング システムに依存します。スタックにプッシュされるか、既知のレジスタを介して渡されます。

「'this' ポインタはコンピュータのメモリのどこに保存されていますか? 」を読んでみてください。

于 2013-10-10T11:53:53.780 に答える
2

「友情」と「メンバーシップ」は別物です。関数は、メンバー関数であってもなくてもよく、独立してフレンド関数であってもなくてもかまいません。

メンバー関数を別のクラスのフレンド関数として宣言できます。つまり、

class B{

   friend void A::func(B);
   //stuff
};

ここで、クラス A のメンバ関数funcはフレンドとして宣言され、B のプライベートにアクセスでき、呼び出さthisれたクラス A のオブジェクトを指すポインタをfunc持ちます。

this ポインターは、C++ 標準のセクション 9.3.2 で説明されている非静的メンバー関数の暗黙的なパラメーターです。関数にどのように渡されるかは、コンパイラ/アーキテクチャによって異なります。つまり、実装定義です (そのため、お気に入りのコンパイラのドキュメントを読んで、thisポインタの管理方法を学習することをお勧めします)。

于 2013-10-10T12:03:34.473 に答える