2

有没有办法判断一个类的静态方法是通过调用类方法还是通过来自对象的调用调用的?

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

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

x 能否区分它在 for c 和 d 中的调用?

谢谢。

4

3 回答 3

7

不是以可移植的方式,在大多数 C++ 实现中可能根本不是。

静态方法确实只是一个名字很有趣的全局函数。理论上,您可以检查调用堆栈以查找调用的来源......但是编译器生成的机器指令很可能对于两者都是相同的

mertx::x();

fred.x();

因为只需要实例的静态类型来查找要调用的方法,并且此信息在编译时可用。因此,在这两种情况下,调用代码都只会调用函数,而无需引用fred实例。

于 2012-06-08T16:15:07.980 回答
6

不,没有办法区分。这两个调用是相同的。

出于好奇,您有什么理由尝试这样做吗?

希望这可以帮助!

于 2012-06-08T16:09:17.960 回答
-2

您可以同时拥有同名的静态和非静态函数

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

否则,正如已经指出的那样,x 没有机会告诉它是如何被调用的。

于 2012-06-08T18:09:41.787 回答