中“宁可以编译器替换预处理”算是另一种提法,不过这个应该是概括性的说法吧
主要事项注意如下:
1用const double AspectRatio=1.653;代替#define ASPECT_RATIO 1.653
原因是预编译时define会被简单的替换,这样在编译时丢掉了ASPECT_RATIO,如果不正
当使用了ASPECT_RATIO编译时提示出错的可能只是1.653,这时候查找起来麻烦多了
另一个原因是定义成变量后编译时只有一份拷贝,节约了代码
当然这个条款也有特例
1)当出现指针的时候要这样
const
char * const
autherName = "Scott Mayers" ;
|
即指针和其内容都不可变,当然如果是字符串string会比上面的char更合适
const std::string autherName("Scott Mayers");
2)注意class的专属常量,通过使得常量成为class的一个member将常量作用域限制在class内,而#defnie做不到。
通过使用static使常量只有一份拷贝
static
const int NumTurns = 5;
|
但上面给出的是声明而非定义,通常C++要求对任何东西的使用都要有定义式,但
像这种情况则可以例外,只要不取他们的地址就可以。
如果取地址,或者因为编译器的原因要求定义式,这定义如下:
const
int GamePlayer::NumTurns;
|
class常量已经声明了初值,这里就不在设了。
旧的编译器可能不支持以上语法,那么你可以把初值放在定义式中。
这又有例外了,编译器期间需要一个calss常量时(如数组scores[]的声明式),编译器又不允许“static整数型class常量”完成“in class”初值设定,可以改用“the enum hack”来实现。
如
emum hack的方法其实和#define又有些像了,例如不能取得地址,如果不想让人获得地址或者reference这样正好。另外Enmus和,#define绝不会导致不必要的内存分配(为什么这么说?难道编译器不会为Enmus分配内存?#define不知在每次调用都会占一次内存吗?const只有一份拷贝,不管调用多少次,难道const比define还多费了内存??)
3)回到预处理器来,另一个常见的#define误用情况是以它实现宏(macros)。
宏看起来像函数,但不会招致函数调用(function call)带来的额外开销。
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
无论何时当你写出这种宏,必须记住为宏中的所有实参加上小括号,即使是加了括号,也还是会有问题。如
int a = 5, b = 0;
CALL_WITH_MAX(++a, b); //a被累加二次
CALL_WITH_MAX(++a, b+10); //a被累加一次在这里,调用f之前,a的递增次数竟然取决于"它被拿来和谁比较"!
用inline函数来解决这个问题
template inline函数(见条款30):
inline
void callWithMax( const
T& a, const
T& b)
|
对于单纯常量,最好以const对象或enums替换#defines。
对于形似函数的宏(macros),最好改用inline函数替换#defines
分享到:
相关推荐
条款02:尽量以const,enum,inline替换#define 条款03:尽可能使用const 条款04:确定对象被使用前已先被初始化 2.构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 条款06:若不想使用编译器自动成生...
const #define inline的用法及区别
1.2 条款02:尽量以const,enum,inline替换#define 这个条款或许可以改为“宁可用编译器替换预处理器”。 通常C++要求你对所使用的任何东西提供一个定义式,但如果它是个class专属常量 又是static且为整数类型...
Effective C++目 录一.让自己习惯C++ 1条款02:尽量以const,enum,inline替换#define 11)以const替换#defin
条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 条款4:尽量使用c++风格的注释 第二章 内存管理 条款5:对应的new和delete要采用相同的形式 条款6:析构...
例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛...
Effective C++(编程的50个细节)着重讲解了编写C++程序应该注意的50个细节问题,书中的每一条准则描述了一个编写出更好的C++的方式,每一个条款的背后都有具体范例支持,书中讲的都是C++的编程技巧和注意事项,很多都...
条款02:尽量以const, enum, inline替换 #define prefer consts,enums, and inlines to #defines. 条款03:尽可能使用const use const whenever possible. 条款04:确定对象被使用前已先被初始化 make sure that ...
提高编程效率的50条建议 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 内存管理的建议 设计与说明的建议 继承与面向对象的设计 杂项
《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》讲述如何用标准c++进行企业级的软件开发,通过“问题/解答”的方式,启发读者思考,帮助了解隐藏在问题背后的设计思想,以及各种编程指导原则适用...
EFFECTIVE C++ 条款03 尽量使用const 思维导图
是a+b 然后去和c,d 相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了 c*a + b*d 另外举一个例子: #define pin (int*); pin a,b; 本意是a 和b 都是int 型指针,但是实际上变成int* a,b; ...
本文主要介绍了C语言中const与#define的区别,希望对你的学习有所帮助。
C++中const与#define的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在...
浅谈C++中的几个关键字static,const,inline.doc 浅谈C++中的几个关键字static,const,inline.doc
尽量用const和inline而不用#define这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:
effective stl pdf 怎么使用stl 这里几乎都有说明 条款1: 仔细选择你要的容器 条款2: 小心对“容器无关代码”的幻想 条款3: 使容器里对象的拷贝操作轻量而正确 条款4: 用empty来代替检查size是否为0 条款5: ...
条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator 条款27:用distance和advance把const_iterator转化成iterator 条款28:了解如何通过reverse_iterator的base得到iterator ...