认识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
说明枚举类型本身不会占用内存空间,而枚举的对象会占用内存空间

浙公网安备 33010602011771号