为什么静态成员函数只能在类定义中声明为static而不是在自己的定义中?

时间:2014-09-22 15:02:35

标签: c++ static member-functions

在屏幕上实现用于创建/更新框的类时,我想添加一个静态成员函数,确保当前没有可见的框重叠(将其信息从静态指针数组传递到所有当前可见的框)

我的初始代码具有以下结构:

class Box
{
public:
    // ...
    static void arrangeOverlappingBoxes();
};

static void Box::arrangeOverlappingBoxes()
{
    // ...
}

我很惊讶这产生了错误C2724:'静态'不应该用于在文件范围定义的成员函数。

通过一些试用,谷歌和错误,我发现我的功能定义应该丢失关键字static,即它应该是

void Box::arrangeOverlappingBoxes()
{
    // ...
}

但我不知道这背后的理由是什么。在类定义及其自己的定义中,它的声明具有不同的函数头似乎是如此不对称和令人困惑。这有什么理由吗?

1 个答案:

答案 0 :(得分:10)

您的类定义(在头文件中)将为函数提供必要的任何项目:

  • 静态
  • 内联
  • 虚拟

考虑到每个进一步的对象都会使用.h查看你的类定义,那么在那里定义这些属性是有意义的。

此外,类中的每个函数都将在派生类中确定它的属性(例如,您需要在基类中声明析构函数virtual,每个后续继承都将析构函数作为虚函数)。 / p>

在您的实现主体中重新声明这些属性是没有意义的。

必须在.h和.cpp文件中声明函数属性实际上会导致所有问题。 想象一下这种情况:在.h文件中声明一个虚函数,在.cpp文件中声明为static。编译器将使该功能发生什么?虚拟还是静态? (或者更可能是编译错误,但编译器错误只会促使你在.cpp文件中匹配标题中的声明。你不能根据"静态"或"虚拟& #34;。)