effective-c 条款2理解与思考
2024-10-20 16:42:50
尽量使用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
最新文章
- spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
- 对一个二维数组进行升序排列a[0][1]为最小
- 关于JAVA的String类的一些方法
- HTML里的id等属性命名需要注意
- SpringMVC 3.1集成Spring Security 3.1
- python 学习(一)
- C# 当前程序所有线程
- CentOS自带mysql配置(密码更改、端口开放访问、添加进系统启动项)
- 为什么覆写equals()方法的时候总是要覆写hashcode()?
- BZOJ 3790: 神奇项链 [Manacher 贪心]
- 《android开发艺术探索》读书笔记(六)--Drawable
- TCP的三次握手与四次挥手(个人总结)
- Android RadioGroup 学习
- bootstrap排列顺序
- linux下安装python,Django,虚拟环境
- 性能测试七:jmeter进阶之文件上传下载、定时器
- zyb的面试(广工14届比赛)
- 根据list集合某个字段进行排序
- RTMP与HLS压力测试工具安装与配置
- springmvc中的拦截器interceptor用法
热门文章
- CSS 属性选择器 ~=, |=, ^=, $=, *= 的区别
- 【单元测试】Junit 4(三)--Junit4断言
- Aspose.Cell和NPOI生成Excel文件2
- OpenFOAM 编程 | 求解捕食者与被捕食者模型(predator-prey model)问题(ODEs)
- chrome工具调试
- Go实现栈与队列基本操作
- K8s 生产最佳实践-限制 NameSpace 资源用量
- 超精准!AI 结合邮件内容与附件的意图理解与分类!⛵
- 我的第一个项目(二):使用Vue做一个登录注册界面
- MyEclipse反编译插件安装于使用