条款2:尽量以const,enum,inline替换#define
2012-09-04 21:57
351 查看
这一条款也被称作:宁可用编译器替换预处理器。从以下几方面说明:(最开始的那一段似乎跟编译原理有关,我是不懂的,就不说了):
对于一般用#defined定义的常量,可以使用const类型代替。
但是要注意两种特殊情况:假如我们要在头文件中定义一个不能被修改的字符串,那么需要使用const char* const类型的指针:
第二种情况是与类有关的。你无法通过#define来确定一个有作用域的常数,但是可以用static const来完成。比如你定义了数组长度为5,可以这样做。在头文件中:
这里还有static int times变量的原因是因为它们的声明、定义完全不同!在对应的源文件中,只有
也就是说,对于一般的staic变量(这里是times),是在头文件中声明它是static,而在源文件中定义的;而对于static const变量,假如这个变量是“整数”类型:int,char,bool,那么直接就可以直接声明,而不用定义。
#define除了定义一些常量之外,使用#define定义宏,也可以节省函数调用的开销:
然后就可以:
但是这样做有一个致命的问题:
int c = FIND_MAX_VALUE(++a,b);后c为12;而int c = FIND_MAX_VALUE(++a,b+10);后c为11!这是一件多么令人惊奇的事啊!所以,为了防止出现这种乱子,c++提供了内联函数,这种函数在调用时,会在调用点展开,开销比较小。
简而言之:如果是#define常量,用const替换;如果是为了定义类似函数的宏,则用内联函数替换。
对于一般用#defined定义的常量,可以使用const类型代替。
但是要注意两种特殊情况:假如我们要在头文件中定义一个不能被修改的字符串,那么需要使用const char* const类型的指针:
char a = 'A'; char b = 'B'; char* const pa1 = &b; //pa1 = &a; 表明指针的指向不能变 *pa1 = 'C'; //可以改变指针指向对象的值 const char* pa2 = &a; //*pa2 = 'B'; 指针指向的对象是常量,不能修改 pa2 = &b; //可以改变指针的指向 const char* const cptr = "const";//此时,不论是指针的指向还是指针指向的对象值都不能修改
第二种情况是与类有关的。你无法通过#define来确定一个有作用域的常数,但是可以用static const来完成。比如你定义了数组长度为5,可以这样做。在头文件中:
class Test { private: //记录整个所有Test类型对象调用fun函数的次数 static int times; //数组的长度 static const int arraySize = 5; public: void fun() { std::cout<<++times<<std::endl; } int Array[arraySize]; };
这里还有static int times变量的原因是因为它们的声明、定义完全不同!在对应的源文件中,只有
#include "item2.h" int Test::times = 0; //const int Test::arraySize;
也就是说,对于一般的staic变量(这里是times),是在头文件中声明它是static,而在源文件中定义的;而对于static const变量,假如这个变量是“整数”类型:int,char,bool,那么直接就可以直接声明,而不用定义。
#define除了定义一些常量之外,使用#define定义宏,也可以节省函数调用的开销:
#define FIND_MAX_VALUE(a,b) (a) > (b) ? (a) : (b)
然后就可以:
int a = 10,b = 5; int c = FIND_MAX_VALUE(a,b);
但是这样做有一个致命的问题:
int c = FIND_MAX_VALUE(++a,b);后c为12;而int c = FIND_MAX_VALUE(++a,b+10);后c为11!这是一件多么令人惊奇的事啊!所以,为了防止出现这种乱子,c++提供了内联函数,这种函数在调用时,会在调用点展开,开销比较小。
简而言之:如果是#define常量,用const替换;如果是为了定义类似函数的宏,则用内联函数替换。
相关文章推荐
- Effective C++ 条款02 尽量以const,enum,inline替换#define
- Effective C++ 条款2 尽量以const,enum,inline替换#define
- Effective C++ -----条款02:尽量以const, enum, inline替换 #define
- 条款二 尽量使用const,enum,inline替换#define
- 条款02:尽量以const, enum, inline替换#define(Prefer consts,enums, and inlines to #defines)
- 条款02:尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define
- 条款02:尽量以const,enum,inline替换#define
- [effectiv c++]条款2:尽量以const,enum,inline替换#define(static,const定义式)
- 条款2:尽量以CONST,ENUM,INLINE替换#DEFINE
- 《Effective C++读书笔记》--条款02尽量以const,enum,inline替换#define
- 条款02 尽量以const ,enum,inline替换#define
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
- 《Effective C++》条款02:尽量以const,enum,inline替换#define
- Effective C++_笔记_条款02_尽量以const、enum、inline替换#define
- 条款2:尽量以const,enum,inline 替换 #define
- effective C++(第三版)读书笔记一——条款二:尽量以const,enum,inline替换#define
- 条款2:尽量以const,enum,inline替换#define
- 条款2:尽量以const, enum, inline 替换#define
- 条款2:尽量以const、enum、inline替换#define