c++ - 为什么调用静态成员函数。或 -> 语法合法?

标签 c++ static member-functions

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/

相关文章:

java - JAVA同名类中的静态和非静态方法

C++ 成员函数链接返回类型和派生类

c++ - 将 QGraphicsView 添加到 QBoxLayout

c++ - 将输入的值存储在cpp中的数组中

c++ - 在 Qt 5.2.1 上编写的 SSL 服务器的 SSL 握手失败

wpf - 为什么一个 Path 资源不能被多个 StaticResource 引用使用?

java - Java中的嵌套类作为测试方法

c++ - 构造函数没有被调用?

c++ - 为什么在单独的线程中调用成员成员函数会导致不确定的行为?

c++ - 静态成员函数和线程安全