1、介绍
本文介绍类内静态常量定义和声明的用法,在编程时经常遇到需要定义一个常量,而且如果要确保其的有效性在某个范围内,则需要将其定义在一个class内。而其用法常会遇到一些问题,下面简要说明其中会遇到的一个问题。
2、声明时初始化
直接上源码
class game
{
private:
static const int gameturn = 10;//vs2015支持类内初始化
int scores[gameturn];
};
我们定义一个类,其中包含静态常量(static 、const)gameturn,类内声明时已经初始化,此时编译器保证支持类内定义初始化。3、定义时初始化
直接上源码
class Game
{
private:
static const int GameTurn ;//常量声明,若编译器不支持类内定义,则需要此种方式定义
int scores[GameTurn];//而不用类内定义,编译会遇到问题,因为当前class内需要该常量
};
const int Game::GameTurn = 10;//常量在此定义
此时的初始化赋值发生在定义时,但是我们注意一个问题,这个类中包含scores数组变量编译时需要需要知道其数组大小,而数组大小正是由上述的静态常量GameTurn确定的,所以此时的编译会出现问题。
所以总结上述问题,我们待解决的问题应该是编译器不支持类内定义初始化静态常量,但类内又有变量用到该静态常量的问题。
4、enum hack
直接上源码
class Game
{
private:
enum { GameTurn = 10 };//将GameTurn定义为一个枚举常量
int scores[GameTurn];
};
此时就就解决了上述的问题,将GameTurn定义为一个枚举常量,此时编译器能顺利通过。 小生第一篇博客~~