`
kanwoerzi
  • 浏览: 1643285 次
文章分类
社区版块
存档分类
最新评论

effective C++(第三版)读书笔记一——条款二:尽量以const,enum,inline替换#define

 
阅读更多
中“宁可以编译器替换预处理”算是另一种提法,不过这个应该是概括性的说法吧
主要事项注意如下:
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使常量只有一份拷贝
class GamePlayer(){
private:
static const int NumTurns = 5;
int scores[NumerTurns];
……
};
但上面给出的是声明而非定义,通常C++要求对任何东西的使用都要有定义式,但
像这种情况则可以例外,只要不取他们的地址就可以。
如果取地址,或者因为编译器的原因要求定义式,这定义如下:
const int GamePlayer::NumTurns;//将此式放进一个实现文件而非头文件
class常量已经声明了初值,这里就不在设了。
旧的编译器可能不支持以上语法,那么你可以把初值放在定义式中。
这又有例外了,编译器期间需要一个calss常量时(如数组scores[]的声明式),编译器又不允许“static整数型class常量”完成“in class”初值设定,可以改用“the enum hack”来实现。
class GamePlayer {
private:
enum { NumTurns = 5 };
int scores[NumTurns];
……
}
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):

    template<typename T> //由于我们不知道具体会操作什么类型,所以用模板
    inline void callWithMax(const T& a, const T& b) //T是什么,所以采用
    { //pass by reference-to-const.
    f(a > b ? a : b); //见条款20.
    }

      对于单纯常量,最好以const对象或enums替换#defines。
      对于形似函数的宏(macros),最好改用inline函数替换#defines
      分享到:
      评论

      相关推荐

        Effective C++ 中文版

        条款02:尽量以const,enum,inline替换#define 条款03:尽可能使用const 条款04:确定对象被使用前已先被初始化 2.构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 条款06:若不想使用编译器自动成生...

        const #define inline

        const #define inline的用法及区别

        Effective_C++_笔记

        1.2 条款02:尽量以const,enum,inline替换#define 这个条款或许可以改为“宁可用编译器替换预处理器”。 通常C++要求你对所使用的任何东西提供一个定义式,但如果它是个class专属常量 又是static且为整数类型...

        EffectiveC++终稿44__tagged_2019-06241

        Effective C++目 录一.让自己习惯C++ 1条款02:尽量以const,enum,inline替换#define 11)以const替换#defin

        Effective.C++.中文第二版.50条款doc文档.chm

        条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 条款4:尽量使用c++风格的注释 第二章 内存管理 条款5:对应的new和delete要采用相同的形式 条款6:析构...

        c++ 尽量不要使用#define 而是用const、enum、inline替换。

        例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 … … 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛...

        Effective C++

        Effective C++(编程的50个细节)着重讲解了编写C++程序应该注意的50个细节问题,书中的每一条准则描述了一个编写出更好的C++的方式,每一个条款的背后都有具体范例支持,书中讲的都是C++的编程技巧和注意事项,很多都...

        Effective C++(第三版)

        条款02:尽量以const, enum, inline替换 #define prefer consts,enums, and inlines to #defines. 条款03:尽可能使用const use const whenever possible. 条款04:确定对象被使用前已先被初始化 make sure that ...

        Effective c++

        提高编程效率的50条建议 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而不用malloc和free 内存管理的建议 设计与说明的建议 继承与面向对象的设计 杂项

        exceptional c++:47个c++工程难题、编程问题和解决方案(英文版)

        《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》讲述如何用标准c++进行企业级的软件开发,通过“问题/解答”的方式,启发读者思考,帮助了解隐藏在问题背后的设计思想,以及各种编程指导原则适用...

        EFFECTIVE C++ 条款03 尽量使用const 思维导图

        EFFECTIVE C++ 条款03 尽量使用const 思维导图

        C语言 #define用法集锦[修正版]

        是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的区别,希望对你的学习有所帮助。

        C++中const与#define的利弊分析

        C++中const与#define的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在...

        浅谈C++中的几个关键字static,const,inline.doc

        浅谈C++中的几个关键字static,const,inline.doc 浅谈C++中的几个关键字static,const,inline.doc

        C语言编程技巧 关于const和#define的区别心得

        尽量用const和inline而不用#define这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:

        effective stl 中文 pdf

        effective stl pdf 怎么使用stl 这里几乎都有说明 条款1: 仔细选择你要的容器 条款2: 小心对“容器无关代码”的幻想 条款3: 使容器里对象的拷贝操作轻量而正确 条款4: 用empty来代替检查size是否为0 条款5: ...

        effective stl stl 技巧

        条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator 条款27:用distance和advance把const_iterator转化成iterator 条款28:了解如何通过reverse_iterator的base得到iterator ...

      Global site tag (gtag.js) - Google Analytics