不能对 c++ 类实现文件中的静态方法使用 "static" 关键字 (.cpp)

Can't use "static" keyword on a static method in a c++ class implementation file (.cpp)

本文关键字:static 关键字 cpp 静态方法 c++ 实现 文件 不能      更新时间:2023-10-16

考虑:

//在Vector2.h 中

class Vector2
{
    public:
        // returns the degrees in radians
        static double calcDir(double x, double y);
}

//在Vector2.cpp 中

double Vector2::calcDir(double x, double y)
{
    double rad = ...;
    return rad;
}

为什么Vector2.cpp中的签名中不需要关键字static?当我尝试这个时,它会产生一个错误:

static double Vector2::calcDir(double x, double y)

在我看来,这似乎不一致。方法签名的所有其他部分都需要在.cpp文件中重复(返回类型、方法名称(duh)、参数的名称和类型、常量)。我不喜欢一眼就不知道一个方法是否是静态的(在查看实现时)。

这不仅是不需要的,而且是被禁止的,这有什么原因吗?

这是因为static在类定义中使用时具有特殊含义。在类定义中,它将函数标识为静态成员函数,这意味着它不在类实例上操作,但可以独立调用。

在类之外static为函数提供内部链接,但这在(甚至是静态的)成员函数上是非法的,因为类成员必须与它们所属的类具有相同的链接(几乎总是外部的,在可以在类定义之外定义成员函数的情况下当然是外部的)。

从语言的角度来看,类定义中成员的声明遵循一组语言规则,其中static具有特殊的类含义。在类定义之外,所有函数定义(成员和非成员)都遵循相同的规则集,其中static具有其他含义,这对具有外部链接的类的成员无效。

这可能是为了减少混淆。在文件范围内,关键字static(令人困惑)被用来表示"使用内部链接"(TC++PL p.200)。这可能意味着该函数虽然是一个类的成员,但仅在当前翻译单元内可见。允许使用静态说明符会更令人困惑。

请注意,不再建议使用static来表示内部链接,并且应该首选匿名命名空间来实现这一点。

令人讨厌的是,关键字最终调用了两个非常不同的功能(全局到所有类实例和本地到文件),但下面的小标题可能有用。宏只是扩展为一个空字符串,这意味着你可以将它放在实现文件中方法的声明之前,一年后回到你的代码中,你将避免大量使用2000行的"boost风格"头来找出编译器不允许你使用它的原因。

静态方法h:

/*
** macro sugar for maintaining readability
** of static methods in implementation files
*/
#ifndef STATICMETHOD
#define STATICMETHOD

在.cpp文件中,您可以使用:

#include "staticmethod.h"
STATICMETHOD double Vector2::calcDir(double x, double y)
{
    double rad = ...;
    return rad;
}