今天刷学校的OJ,题目要求创建一个圆柱体类,并在其内定义一个公有的静态常量Pi,于是乎我遇到了一个让我头大的问题,就是类内静态常量的定义及初始化,我边查边试了很多种写法,才终于搞定,现在简单总结如下:
1)比较稳定的写法(OJ平台并不完全支持C++11的情况下):
这种写法不挑平台,非常好。
class Cylinder{
...
public:
static const double Pi;//定义静态常量
...
};
const double Cylinder::Pi=3.1415926;
//类外初始化
说到此写法的由来,我是这么理解的,首先我们回顾一下类内定义静态变量及其初始化的写法:
class Cylinder{
...
public:
static double Pi;//定义静态变量
...
};
double Cylinder::Pi=3.1415926;
//类外初始化
由此可见,静态常量初始化的写法是以上写法的延伸,static后面修饰的类型变成了const double而已。
2)有的平台认、有的平台不认的写法:
如果平台完全支持C++11,那一般这么写是没事的。
class Cylinder{
...
public:
static constexpr double Pi=3.1415926;
//使用constexpr来达到类内初始化静态常量
...
};
这种写法如果不支持,会报错如下
或者不用constexpr直接初始化。
class Cylinder{
...
public:
static const double Pi=3.1415926;
//定义静态常量的时候直接初始化
...
};
这种写法如果不支持,会报错如下
总结:
遇到版本特性兼容导致的bug,要寻找到最稳定的写法,且一定要掌握。
虽然类内不一定能给静态常量初始化,但是非静态常量在定义时是一定要初始化的(仅有const修饰)。