认识enum hack

阅读Effective C++的时候,读到条款02:尽量以const、enum、inline 替换#define

里面涉及到enum hack, 看的有些一知半解,特意查询资料理解了一下, 整理如下:

英文直译:enum hack 是枚举基础, 其理论基础是:一个属于枚举类型(enumerated type)的数值可权充ints被使用。

背景是:为了防止定义的值被拷贝多份, 需要我们在类内部声明 const  static 常量, 但是基于旧的编译器, 不允许static成员变量在其声明式上获得初值, 所以不得以会将初值放到定义式里面。
但是特殊情况下,例如数组声明式中,我们坚持需要确切的知道数组的大小,  我们就需要使用the enum hack 补偿法。
定义格式如下:

 1 class GemePlayer {
 2 private:
 3 
 4   enum { NumTurns = 5 };                     //"the enum hack" ---令NumTurns 成为5的一个记号名称
 5 
 6   int scores[NumTurns];
 7 
 8   ....
 9 
10 }

我们为什么要认识enum hack, 书中也给出两个主要理由:

第一,enum hack的行为某方面说比较像#define而不像const, 有时候这正是你想要的。 例如取一个const的地址是合法的, 但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。

如果你不想让别人获得一个pointer或者reference指向你的某个整数常量,enum可以帮你实现这个约束。

也就是你想使用#define的特性,而又不接受#define内存复制的问题, enum hack就是你最好的选择。

 

第二, 纯粹为了实用主义,很多代码用了它,所以看到它,你必须认识它,而且了解为什么要这么用,知其然,知其所以然很重要。 

 

ps:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A{
 5 public:
 6     enum enumHack{a = 5, b = 10};
 7 };
 8 
 9 class B {
10 public:
11     enum enumHack { a = 5, b = 10 };
12     enumHack eh;
13 };
14 
15 int main()
16 {
17     cout << "sizeof(Class A) = " << sizeof(A) << endl;
18     cout << "sizeof(Class B) = " << sizeof(B) << endl;
19 
20     return 0;
21 }

运行结果:

sizeof(Class A) = 1
sizeof(Class B) = 4

说明枚举类型本身不会占用内存空间,而枚举的对象会占用内存空间

 

posted @ 2020-06-11 17:48  六耳丿猕猴  阅读(679)  评论(0)    收藏  举报