[C++] effective_C++_条款02
2017-09-01 13:47
239 查看
条款02:尽量用const, enum, inline代替#define
该原则言下之意是说使用编译器替换预处理器假设你使用下面的表达式:
#define ASPECT_RATIO 1.653
记号名称ASPECT_RATIO也许从未被编译器看到,也许在编译器开始处理源代码之前它就被预处理器移走了,于是ASPECT_RATIO可能从来没进入记号表中,于是当你运用此常量但获得一个编译错误信息时,你可能不知道这个1.653是什么意思,这就是#define的坏处。
因此你可以使用一个常量来替换上述的宏:
const double AspectRatio = 1.653;
作为一个语言常量,AspectRatio肯定会被编译器看到,当然会进入记号表中
在定义常量指针时,由于常量定义通常被放在头文件中,以便被不同的源码包含,因此有必要将指针声明为const,例如若要在头文件内定义一个常量的char*字符串,需要些const两次:
const char* const authorName = "Scott Meyers";
class专属常量。为了将常量的作用域限制于class内,你必须让它成为class的一个成员,而为确保此常量至多只有一份实体,必须让它成为一个static成员:
class GamePlayer { private: static const int NumTurns = 5; // 常量声明式 int scores[NumTurns]; // 使用该常量 }
通常C++要求所使用的任何变量均需提供定义式,但如果它是一个class专属常量又是static且为整数类型(integral types, ints, chars, bools),则需特殊处理,只要不取它们的地址,可以只声明并使用它们而无需提供定义式;但如果你取某个class专属常量的地址,你就必须提供下面的定义式:
const int GamePlayer::NumTurns; // 定义
在C++中,在默认情况下,全局变量的链接性是外部的,但const全部变量的链接性是内部的,也就是说,在C++看来,全局const定义就像使用了static说明符一样。
全局变量在多线程中容易出问题, 一份优秀的代码是几乎不出现全局变量的
一个属于枚举类型的数值可当做ints使用,即”the enum hack”
class GamePlayer{ enum {NumTurns = 5}; int scores[NumTurns]; };
the enum hack 技术的好处:
当你不想让别人获得一个pointer或reference指向你的某个整数常量时,enum可以实现
enum和#define不会导致非必要的内存分配
相关文章推荐
- 《Effective C++ 》学习笔记——条款02
- 《Effective C++ 》学习笔记——条款02
- <Effective C++>条款02:尽量以const,enum,inline替换#define
- 读书笔记_Effective_C++_条款三十二:确定你的public继承继承塑模出is-a关系
- Effective C++——条款52(第8章)
- Effective Modern C++ 条款36 如果异步执行是必需的,指定std::launch::async策略
- Effective C++——》条款22:将成员变量声明为private
- 读书笔记_Effective_C++_条款九:绝不在构造和析构函数中调用virtual函数
- More Effective C++ 条款23 考虑使用其他程序库
- More Effective C++ 条款24 了解virtual function,multiple inheritance,virtual base classes,runtime type identification的成本
- Effective C++:条款06
- 读书笔记_Effective_C++_条款十一:在operator=中处理自我赋值
- More Effective C++ 条款2 最好使用C++转型操作符
- More Effective C++ 条款7
- More Effective C++ 条款18
- More Effective C++ 条款21
- More Effective C++ 条款26(上)
- Effective C++ -----条款40:明智而审慎地使用多重继承
- 读书笔记_Effective_C++_条款二十七:尽量少做转型动作
- 读书笔记_Effective_C++_条款十九:设计class犹如设计type