类型限定符语法和静态构造方法不兼容
Type Qualifier Syntax and Static Const Method Incompatibility
问题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
指针。没有什么值得大惊小怪的。
相关文章:
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 如何在不使用静态矩形方法的情况下创建 IDOMPathGeometryPtr?
- 如何模板静态工厂方法?
- 不满足需要静态模板方法的模板模板概念的约束
- 将静态空隙方法存储为函数
- 如何初始化堆,以便静态构造函数可以在常规 MFC dll 中使用堆?
- 我可以从静态基方法获取当前类类型 ID 吗?
- C++返回容器的静态构造函数
- 对另一个静态库中静态库方法的未定义引用
- C++对象构造方法之间的差异
- 模拟模板类的静态构造函数
- 用于命名模板静态类方法的特定实例的语法
- 如何在 C++11 中编写这个 C++17 静态 constexpr 方法
- 必须定义所有静态类方法,即使不使用
- 稍后可以成为静态的方法
- 标题C 中的静态类方法声明
- c++中的静态构造函数和致命错误LNK1120:1个未解析的外部
- Boost::log 使用静态工厂方法
- 为什么仅适用于C 的课堂上定义衍生类的构造方法
- 类型限定符语法和静态构造方法不兼容