C ++类名作为类成员

时间:2015-01-27 13:30:11

标签: c++

以下代码中AttrNode().AttrNode中后缀表达式main的含义是什么? gcc和clang都可以编译代码而不会出现任何错误。似乎它在C ++标准中是合法的。但这些代码的含义是什么?为什么C ++标准允许这样的使用?

#include <stdio.h>

struct AttrNode {
public:
     AttrNode() {}
     static void make() {}
};

int main() {
    AttrNode().AttrNode::make();
    return 0;
}

谢谢!

1 个答案:

答案 0 :(得分:8)

AttrNode::符合名称make,明确调用AttrNode::make,而不是任何其他名为make的函数。

在这种情况下,这是多余的; AttrNode().make()会做同样的事情:创建一个临时对象,调用该函数,然后销毁该对象。因为它是一个静态函数,所以通常在不创建对象的情况下调用它,AttrNode::make()

如果它是一个虚函数,会导致对指定类中的函数进行非虚拟调用,而不是虚拟调用最终覆盖,这会有所不同。该语法还可用于访问基类中已隐藏在派生类中的名称。