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

时间:2012-01-11 20:26:57

标签: c++ static static-methods

考虑:

//在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 double Vector2::calcDir(double x, double y)

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

是否有理由这不仅是必需的,而且是禁止的?

3 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:1)

这可能是为了减少混乱。在文件范围内,'关键字 static (令人困惑地)用于表示“使用内部链接”(TC ++ PL第200页)。它可能意味着函数虽然是类的成员,但只能在当前的翻译单元中看到。允许静态说明符会更加令人困惑。

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

答案 2 :(得分:1)

令人讨厌的是,关键字最终会调用两个非常不同的功能(全局到所有类实例与本地到文件),但可能会使用以下小标题。宏只是扩展为一个空字符串,这意味着你可以在实现文件中的方法声明前添加它,并在一年后回到你的代码中,你将避免倾注2000行"提升-esque"标题找出为什么编译器不会让你使用它。

staticmethod.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;
}