类型限定符语法和静态Const方法不兼容

时间:2015-12-08 05:45:11

标签: c++ static const static-methods

问题#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对静态方法有效?

1 个答案:

答案 0 :(得分:0)

  

是否有理由在声明中使用类型限定符而不是定义(除了"仅仅因为")。

static不是类型限定符。

如果问题被重写为"为什么static关键字在声明中使用而不在定义"中,答案是static内部具有不同含义课外。所谓的对称性#34;如果不含糊,会引起混淆。

  

第二个问题:为什么静态方法与const不兼容?

静态成员函数没有this指针。没有什么可以符合限定条件。