【发布时间】:2016-03-12 22:58:58
【问题描述】:
问题 #1:类型说明符和限定符之间的不对称
在 C++ 中,类型说明符用于声明和定义。例如,如果我声明
unsigned int numWheels();
在 Car 类中,然后我使用相同的类型说明符定义函数:
unsigned int Car::numWheels()
类型限定符不同。当我声明:
static unsigned int numWheels();
正确的定义方式是不使用静态限定符:
unsigned int Car::numWheels()
在声明中使用类型限定符而不在定义中使用类型限定符是否有原因(“只是因为”除外)。
第二个问题:为什么静态方法与 const 不兼容?
一般来说,全局变量的最佳方法(我确定有反例,我说的是一般性)是将全局变量实现为受保护的静态类变量,然后创建公共 getter 和/或 setter .最明显的做法是:
class Foo
{
public:
static int getReadOnlyInt() const;
protected:
static int readOnlyInt_;
};
int Foo::readOnlyInt_ = 0;
int Foo::getReadOnlyInt() const
{
return readOnlyInt_;
}
但这是错误的。在创建类 Foo 时,我想向 Foo 的未来用户表明,方法 Foo::getReadOnlyInt() 保证是检查器,而不是修改器。变量 readOnlyInt_ 可以避免修补!因此,使用 cv 限定符 const 声明。
但是,编译器告诉我,静态方法上禁止使用 cv 限定符。甚至应该用 const 声明的方法,比如 getter。
对于该语言来说,这似乎是一个奇怪的设计决定。为什么在静态方法上禁止使用 cv 限定符?
【问题讨论】:
-
static不是类型限定符(不存在这样的术语),它是存储类说明符。说静态“用于声明而不是定义”是不正确的。static是一个重载的关键字,根据上下文可以表示不同的含义。在某些情况下,static可以在定义中使用,而在其他情况下则不能。其他存储类说明符有不同的规则。 -
静态方法与
const不兼容,因为方法签名中的const符合this指针。静态方法没有this指针。
标签: c++ static constants static-methods