【问题标题】:Type Qualifier Syntax and Static Const Method Incompatibility类型限定符语法和静态常量方法不兼容
【发布时间】: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


【解决方案1】:

在声明中使用类型限定符而不在定义中使用类型限定符是否有原因(“只是因为”除外)。

static 不是类型限定符。

如果问题被重写为“为什么 static 关键字在声明中使用但不在定义中”,答案将是 static 在类内部和外部具有不同的含义。所谓的“对称”如果不是模棱两可的话,就会引起混乱。

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

静态成员函数没有this 指针。没有什么可以进行 const 限定的。

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 2013-08-15
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2017-01-30
    相关资源
    最近更新 更多