effective-c 条款2理解与思考
-
尽量使用const,enum,inline替换 #define
因为,#define 替换发生在预处理阶段,编译器对这个替换内容就缺少了类型检测,并且不利于错误信息的查看 -
编译器再声明数组时必须知道数组的大小,而不是使用一个变量,我便有了如下测试
- 枚举类型做数组大小(在类中做成员)
class GamePlayer {
private:
enum { NumTurns = 5 } ;
int scores[NumTurns];
};
可行,编译器看到的
class GamePlayer
{
private:
enum
{
NumTurns = static_cast<unsigned int>(5)
};
int scores[5]; //这里发生了替换
};
- const类型做数组大小(在类中做成员)
class GamePlayer {
private:
const int NumTurns = 5;
int arr[NumTurns];
//error: invalid use of non-static data member 'NumTurns'
//错误不会发生替换
};
将变量变为static时就可以通过编译了
class GamePlayer {
private:
static const int NumTurns = 5;
int arr[NumTurns];
};
可行,编译器看到的
class GamePlayer
{
private:
static const int NumTurns = 5;
int arr[5];
};
- 枚举类型做数组大小(函数中)
void func()
{
enum { NumTurns = 5 } ;
int scores[NumTurns];
}
可行,编译器看到的
void func()
{
enum
{
NumTurns = static_cast<unsigned int>(5)
};
int scores[5];
}
当然类的成员函数中也是一样可行的
- const类型做数组大小(在函数中)
void func()
{
const int NumTurns =5;
int scores[NumTurns];
}
可行,编译器看到的
void func()
{
const int NumTurns = 5;
int scores[5];
}
经过验证在类的成员函数中也是一样可行的
enum hack 的行为某方面说比较像#define 而不像 const, 有时候这正是你想要的。例如取一个 const的地址是合法的,但取一个 enurn 的地址就不合法,而取一个#define 的地址通常也不合法。
如果你不想让别人访问你的指针或引用所指向的某个整数常量,enum可以帮助实现。原因是对enum类型变量取地址是不合法的
-
存在的问题
enum hack 时模板元编程的基础技术 不能理解 -
要记住
对于单纯的常量,最好以const对象或emums替换#define
对于宏函数,最好改用inline函数替换#define