ちょっとした質問があります:)、すべてのメソッドが「密かに」内部にあるクラスの「this」ポインターを取得することを理解していますが、なぜそれが「フレンド」関数に起こらないのですか? クラスのメソッドではないからですか?
機械全体を説明できる人はいますか? 「これ」が実際にどのように機能するのか非常に興味があります!
前もって感謝します!:)
friend
関数とクラスは、コンパイラによってチェックされるアクセス制御に使用されるだけです。friend
関数は単なる標準関数であるため、呼び出し規約に関する違いはありません。friend
関数はどのクラスのメンバーでもないため、this
ポインターは渡されません (static
メンバー関数の場合と同様) 。クラスの非static
メンバー関数は、非表示のthis ポインターを取得します (ABI によっては、これが最初の引数であることが多い)。static
メンバー関数は、インスタンス データに作用しないため、this ポインターを取得しません。
this ポインターがどの程度正確にメンバー関数に渡されるかは、使用される ABI に大きく依存します。これは、アーキテクチャとオペレーティング システムに依存します。スタックにプッシュされるか、既知のレジスタを介して渡されます。
「'this' ポインタはコンピュータのメモリのどこに保存されていますか? 」を読んでみてください。
「友情」と「メンバーシップ」は別物です。関数は、メンバー関数であってもなくてもよく、独立してフレンド関数であってもなくてもかまいません。
メンバー関数を別のクラスのフレンド関数として宣言できます。つまり、
class B{
friend void A::func(B);
//stuff
};
ここで、クラス A のメンバ関数func
はフレンドとして宣言され、B のプライベートにアクセスでき、呼び出さthis
れたクラス A のオブジェクトを指すポインタをfunc
持ちます。
this ポインターは、C++ 標準のセクション 9.3.2 で説明されている非静的メンバー関数の暗黙的なパラメーターです。関数にどのように渡されるかは、コンパイラ/アーキテクチャによって異なります。つまり、実装定義です (そのため、お気に入りのコンパイラのドキュメントを読んで、this
ポインタの管理方法を学習することをお勧めします)。