C++类内静态常量定义和声明及enum hack

本文探讨了在类内初始化静态常量时可能遇到的问题,并提供了两种解决方案:一是利用现代编译器支持的类内初始化;二是使用枚举类型来规避问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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定义为一个枚举常量,此时编译器能顺利通过。
       小生第一篇博客~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值