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

Type Qualifier Syntax and Static Const Method Incompatibility

本文关键字:静态 构造方法 不兼容 语法 类型      更新时间:2023-10-16

问题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不兼容?

静态成员函数没有this指针。没有什么值得大惊小怪的。