1.#define为预处理阶段命令

原因:有可能记号名称没有进入记号表,而出现编译错误,即编译器并没看到过该定义。

class专属常量const 一般定义为static,保证该常量至多有一份实体。

枚举类型值可充当intS型使用。enum{num=3};现在num就是3的一个记号。

对于取地址操作:const是合法的,但是enum和define不能进行取地址操作。

#define定义函数宏的时候容易产生歧义。(括号分配等等,计算顺序。。)

宏无法定义成private,但是内联函数inline可以定义成private inline。

总结:对于单纯常量,做好以const,enum代替#define

对于函数类型的宏定义,最好通过inline替代,因为内联函数可以很好地遵守作用域和访问规则。

2。尽量在定义不变常量的时候用const.编译器会帮助强制执行这项约束。const可以用来修饰:常量(全局,局部),函数,文件,区块作用域中的static对象,指针等。。

const修饰指针:const在*左边,表示被指物是常量,const出现在*右边,表示指针自身是常量。也可出现在*两边。

左边:const char*ptr;等价于char const*ptr;常量指针,指向常量的指针。

右边:指针常量,指向的那块东西不能变,但是东西的值是可以变的。

常量const修饰函数:函数返回值为常量是可以避免用户操作错误而造成的意外。

const成员函数:方便调用const变量。常量性不同的两个函数是可以被重载的,即是否有const修饰的两个函数,是不同的,类似于重载操作。

const char& operator[](size_t p)const{...}

char& operator[](size_t p2){..}

重载的两个不同的函数。。

注意:当const与non-const成员函数有着本质相同的实现时(有一些重复的操作),用NON-CONST去调用const版本的函数可以避免代码重复。原因是const承诺不改变对象的逻辑状态,但是当你用const去调用非const的时候,非const并没承诺不改变对象的逻辑状态,这就造成错误。

1.尽量以const ,enum,inline替换define的更多相关文章

  1. NO.2: 尽量以const,enum,inline 替换 #define

    1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性. 2.const XXX_XX,保证其常量性以及可控的作用域,如 ...

  2. Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define

    1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...

  3. Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define

    尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义 ...

  4. 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define

    其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏. 第一部分:用const和enum替换不带参宏 宏定义#define发生在预编 ...

  5. 条款2:尽量以const, enum, inline替换#define

    原因: 1. 追踪困难,由于在编译期已经替换,在记号表中没有. 2. 由于编译期多处替换,可能导致目标代码体积稍大. 3. define没有作用域,如在类中定义一个常量不行. 做法: 可以用const ...

  6. 条款02:尽量以const,enum,inline替换#define

    目录 1. 总结 2. 使用const常量或enum替换宏常量 class外部的常量指针 class专属常量 1. 总结 对于单纯常量,最好以const常量或enum替换#define 对于宏代码段, ...

  7. Effective C++ -----条款02:尽量以const, enum, inline替换 #define

    class GamePlayer{private: static const int NumTurns = 5; int scores[NumTurns]; ...}; 万一你的编译器(错误地)不允许 ...

  8. 条款2:尽量使用const ,enum,inline替换define

    宁可使用编译器而不用预处理器 假设我们使用预处理器: #define ABC 1.56 这标识符ABC也许编译器没看到,也许它在编译器处理源码前就被预处理器移走了,于是“标识符”ABC没有进入标识符列 ...

  9. Effective C++之条款2:尽量以const enum inline替换 #define

    本文的标题也可以改成“用编译器替换预处理器”: const double AspectRatio = 1.653; //最好使用上述代码替换下述代码: #define ASPECT_RATIO 1.6 ...

  10. Book. Effective C++ item2-尽量使用const, enum, inline替换#define

    ##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATI ...

随机推荐

  1. VSFTP 服务器配置

    解决root用户无法登陆ftp传输文件的问题 配置vsftpd用户,启用root用户.  #cd /etc/vsftpd #vi ftpusers  注释掉root  修改user_list文件  # ...

  2. day03-变量

    Python中的变量类型有: int:带正负号的整数long:在python2中表示长整数,在python3中被放弃complex:复数str:字符串True,False:布尔list:列表dict: ...

  3. FB4.6项目迁移到4.7时 embed报错问题

    问题: 从FB4.6或更早版本移植到4.7的项目Embed标签,比如 [Embed(source="assets/BtnPlay.png")]   ,会报错 解决 方案: 4.7E ...

  4. SAFESEH 映像是不安全的

    1.打开该项目的“属性页”对话框 2.然后单击“链接器”--“命令行”,出现如下界面 3.将 /SAFESEH:NO 复制到“其它选项(D)”框中,然后点击应用 返回VS2013,重新编译运行程序即可 ...

  5. js页面停留时间

    //在线阅读时间 function onlineRead(minutes){ var o= new Object(); o.courseId=courseId; o.userId=userId; o. ...

  6. THE BOX MODEL

    Review In this lesson, we covered the four properties of the box model: height and width, padding, b ...

  7. 3.SLB 回话保持功能分析

    参考文档: 七层会话保持 配置服务器Cookie会话保持常见问题四层监听  

  8. Object-c @property与@synthesize的配对使用。

    功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明. 如: 1.在头文件中: @property int count; 等效于在头文件中声明2个方法: - (int)count; ...

  9. PHP面向对象(抽象类与抽象方法、接口的实现)

    一.抽象类与抽象方法 1,任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的. 2,定义为抽象的类不能被实例化. 3, 被定义为抽象的方法只是声明了其调用方式(参数) ...

  10. [PHP]PHP缓存机制之Output Control

    ---------------------------------------------------------------------------------------------------- ...