gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:00:46 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com