Possible Duplicate:
C++ Static member method call on class instance
今天我发现我长久以来(我的意思是长久——比如,二十年),在 C++ 中认为非法的东西实际上是合法的。即,调用静态成员函数,就好像它属于单个对象一样。例如:
struct Foo
{
static void bar() { cout << "Whatever."; }
};
void caller()
{
Foo foo;
foo.bar(); // Legal -- what?
}
我通常会看到严格使用“范围解析语法”调用静态成员函数,因此:
Foo::bar();
这是有道理的,因为静态成员函数不与类的任何特定实例相关联,因此我们不希望特定实例在语法上“附加”到函数调用。
然而我今天发现 GCC 4.2、GCC 4.7.1 和 Clang 3.1(作为编译器的随机抽样)接受前一种语法,并且:
Foo* foo = new Foo;
foo->bar();
在我的特殊情况下,这个表达式的合法性导致了一个运行时错误,这让我相信这个语法的特殊性不仅仅是学术上的兴趣——它还有实际的后果。
为什么 C++ 允许像调用单个对象的直接成员一样调用静态成员函数——也就是说,通过使用 .或 -> 附加到对象实例的语法?
最佳答案
在 The Design and Evolution of C++ 的第 288 页中,Bjarne Stroustrup 提到在静态成员函数之前的日子里,程序员使用像 ((X*)0)->f 这样的 hack ()
来调用不需要对象的成员函数。我的猜测是,当静态成员函数被添加到语言中时,允许通过 ->
进行访问,因此具有类似代码的程序员可以将 f
更改为 static
无需寻找和更改它的每次使用。
关于c++ - 为什么调用静态成员函数。或 -> 语法合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977137/