1.尽量以const ,enum,inline替换define
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的更多相关文章
- NO.2: 尽量以const,enum,inline 替换 #define
1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性. 2.const XXX_XX,保证其常量性以及可控的作用域,如 ...
- Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define
1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...
- Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define
尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义 ...
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏. 第一部分:用const和enum替换不带参宏 宏定义#define发生在预编 ...
- 条款2:尽量以const, enum, inline替换#define
原因: 1. 追踪困难,由于在编译期已经替换,在记号表中没有. 2. 由于编译期多处替换,可能导致目标代码体积稍大. 3. define没有作用域,如在类中定义一个常量不行. 做法: 可以用const ...
- 条款02:尽量以const,enum,inline替换#define
目录 1. 总结 2. 使用const常量或enum替换宏常量 class外部的常量指针 class专属常量 1. 总结 对于单纯常量,最好以const常量或enum替换#define 对于宏代码段, ...
- Effective C++ -----条款02:尽量以const, enum, inline替换 #define
class GamePlayer{private: static const int NumTurns = 5; int scores[NumTurns]; ...}; 万一你的编译器(错误地)不允许 ...
- 条款2:尽量使用const ,enum,inline替换define
宁可使用编译器而不用预处理器 假设我们使用预处理器: #define ABC 1.56 这标识符ABC也许编译器没看到,也许它在编译器处理源码前就被预处理器移走了,于是“标识符”ABC没有进入标识符列 ...
- Effective C++之条款2:尽量以const enum inline替换 #define
本文的标题也可以改成“用编译器替换预处理器”: const double AspectRatio = 1.653; //最好使用上述代码替换下述代码: #define ASPECT_RATIO 1.6 ...
- Book. Effective C++ item2-尽量使用const, enum, inline替换#define
##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATI ...
随机推荐
- day37-常见内置模块六(其他模块)
其他内置模块 1.subprocess(系统交互)模块 2.math模块 3.zipfile模块 4.keyword模块 5....
- package-info.java
参考文章: http://blog.sina.com.cn/s/blog_93dc666c0101gzlr.html 对于package-info.java我们并不陌生,但又陌生. 在我们每次建立pa ...
- RACSignal常见用法
RACSignal 两种用法, 1:异步操作,一般创建signal的时候写逻辑,然后通过subscribeNext拿到异步执行的结果 2:监听的属性的变化,及时给出回应,一般赋值的时候用RACObse ...
- linux 协议栈tcp的rst报文中,seq的选取问题
之前在<深入理解并行编程>的群里,有个小米的兄弟问了一个问题,服务器A发包给服务器B,Seq是1,但是在未能收到服务器B的报文回复的情况下,发送了rst,但是rst报文中,对应的seq是1 ...
- UNION 与 UNION ALL的区别
UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,列的数量.数据类型.顺序要保持一致!!! 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名. 例子: ...
- js文件引用js文件
我的问题是: a.jsp b.js c.js a.jsp 需要引用 b.js 里面的内容 <head> <script type="text/javascript& ...
- lucene solr
理解 lucene 是一个全文搜索的引擎 solr是全文搜索的web实现 --------------------. java.lang.UnsupportedClassVersionError: ...
- windows7 IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET
IIS7报错:如果要使用托管的处理程序,请安装 ASP.NET windows7,部署在本地的IIS7里以后,结果不能访问承载SL的.aspx页面,而如果用.html承载则可以访问. 亲测可用修复办法 ...
- ztree根据treeId展开指定节点并触发单击事件
ztree.expandNode(ztree.getNodeByParam("id",treeId,null));//展开指定节点 ztree.selectNode(ztree.g ...
- spring boot 集成Thymeleaf