2

クラスの静的メソッドがクラスメソッドの呼び出しによって呼び出されたのか、オブジェクトからの呼び出しによって呼び出されたのかを判断する方法はありますか?

class mertz
{
   static int x(void) {....}
   ....
}

int main( ... )
{
   int c = mertz::x();
   mertz     fred;  
   ind d = fred.x();
}

xはcとdの呼び出しの違いを知ることができますか?

ありがとう。

4

3 に答える 3

7

移植性のある方法ではなく、おそらくほとんどのC++実装ではまったくありません。

静的メソッドは確かに面白い名前のグローバル関数です。理論的には、呼び出しスタックを調べて、呼び出しがどこから来ているかを見つけることができます...ただし、コンパイラによって生成されるマシン命令は、おそらく両方で同じです。

mertx::x();

fred.x();

これは、インスタンスの静的タイプのみが、呼び出すメソッドを見つけるために必要であり、この情報はコンパイル時に利用可能であるためです。fredしたがって、どちらの場合も、呼び出しコードはインスタンスを参照する必要なしに関数を呼び出すだけです。

于 2012-06-08T16:15:07.980 に答える
6

いいえ、違いを見分ける方法はありません。2つの呼び出しは同じです。

好奇心から、これをやろうとしている理由はありますか?

お役に立てれば!

于 2012-06-08T16:09:17.960 に答える
-2

同じ名前の静的関数と非静的関数の両方を持つことができます

class mertz 
{ 
   static int x(void) {....} 
   int x(void) {....}
};

そうでなければ、すでに指摘したように、xはそれがどのように呼び出されたかを伝える機会がありません。

于 2012-06-08T18:09:41.787 に答える