问题#1:类型说明符和限定符之间的不对称
在C ++中,类型说明符用于声明和定义。例如,如果我声明
unsigned int numWheels();
在Car类中,然后我使用相同的类型说明符定义函数:
unsigned int Car::numWheels()
类型限定符是不同的。当我宣布:
static unsigned int numWheels();
正确的定义方法是没有静态限定符:
unsigned int Car::numWheels()
是否有理由在声明中使用类型限定符而不是定义(除了"仅仅因为")。
第二个问题:为什么静态方法与const不兼容?
一般来说,全局变量的最佳方法(我确信有反例,我通常会说)是将全局变量实现为受保护的静态类变量,然后创建公共getter和/或制定者。最明显的做法是:
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()保证是一个检查器,而不是一个mutator。变量readOnlyInt_是安全的修补!因此,使用cv-qualifier const。
声明然而,编译器告诉我静态方法禁止使用cv限定符。甚至是一个应该用const声明的方法,比如getter。
看起来像是一种奇怪的语言设计决定。为什么cv-qualifiers对静态方法有效?
答案 0 :(得分:0)
是否有理由在声明中使用类型限定符而不是定义(除了"仅仅因为")。
static
不是类型限定符。
如果问题被重写为"为什么static
关键字在声明中使用而不在定义"中,答案是static
内部具有不同含义课外。所谓的对称性#34;如果不含糊,会引起混淆。
第二个问题:为什么静态方法与const不兼容?
静态成员函数没有this
指针。没有什么可以符合限定条件。