不能对 c++ 类实现文件中的静态方法使用 "static" 关键字 (.cpp)
Can't use "static" keyword on a static method in a c++ class implementation file (.cpp)
考虑:
//在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;
}
- 这些示例中的 "static" 关键字是否有所作为?
- 为什么静态成员函数定义不能有关键字"static"?
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- 使用 static 关键字禁止使用堆栈内存
- 二元运算符声明的'static'关键字
- static关键字是否影响作用域
- 关键字 static 在 C 和 C++ 之间有什么区别?
- static关键字在类内部和类外部
- 为什么 C++ 不接受函数定义中的 static 关键字
- c++static关键字对大括号有什么作用
- static 关键字是否在 C/C++ 和存储级别中起作用?
- const/static关键字是否在变量声明中传播
- 不能对 c++ 类实现文件中的静态方法使用 "static" 关键字 (.cpp)
- 何时应在非成员函数之前编写关键字 'static'?
- 如何在c++中使用class中的static关键字来模拟Python中@classmethod的行为
- 为什么不允许将类成员定义的' static '关键字放在命名空间范围内?
- 为什么在这个模板代码中需要static关键字?
- 如果我们在c++中使用static关键字删除[-Wreturn local-addr](警告:返回本地变量的地址),可以
- 我可以使用static关键字只分配一次新内存吗
- "static"关键字与类的变量、函数和对象等有什么用?