条款02:尽量以const,enum,inline替换#define
1. 总结
- 对于单纯常量,最好以const常量或enum替换#define
- 对于宏代码段,最好改用inline函数替换#define
2. 使用const常量或enum替换宏常量
当我们以const常量替换#define,有两种特殊情况值得说说。
class外部的常量指针
第一种是定义class外部的常量指针,这种常量定义式通常放在头文件内以便被不同的源文件使用,因此有必要将指针本身声明为const。
例如要在头文件内定义一个常量char *-based字符串,必须写两次const(左数右指),如下所示。
const char *const authorName = "Scott Meyers"; //必须写两次const,左数右指
const std::string authorName("Scott Meyers"); //更好的做法是采用string类型
class专属常量
第二个值得注意的是class专属常量,为了确保该常量最多只有一份实体,必须让它成为static成员变量。
class GamePlayer
{
private:
static const int NumTurns = 5; //常量声明式,而非定义式
int scores[NumTurns]; //使用该常量
};
注意,该示例中展示的是NumTurns的声明式而非定义式,定义式应按照类的static成员变量的语法要求在.cpp文件中进行。
但如果一个常量既是class专属常量又是static且为整数类型(int、char、bool等),则需特殊处理,只要不取它们的地址,你可以声明并使用它们而无需提供定义式。
注意,in-class初值设定只适用于static整数常量,而且即使是static整数常量,有些编译器也可能不支持这种操作,遇到这种情况,可以将初值放在定义式中。
class GamePlayer
{
private:
static const double FudgeFactor; //非整数常量,无法进行-in-class初值设定
static const int NumTurns; //即使是整数常量,编译器也可能不支持in-class初值设定
};
//static常量定义,位于.cpp文件
const double GamePlayer::FudgeFactor = 1.35;
const int GamePlayer::NumTurns = 5;
如果编译器不支持static整数常量的in-class初值设定,但该常量又必须在class编译期间使用,如GamePlayer::scores数组大小,可改用enum代替const。
class GamePlayer
{
private:
enum { NumTurns = 5 };
int scores[NumTurns];
};
条款02:尽量以const,enum,inline替换#define的更多相关文章
- Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define
尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义 ...
- 读书笔记_Effective_C++_条款二:尽量以const, enum, inline替换#define
其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏. 第一部分:用const和enum替换不带参宏 宏定义#define发生在预编 ...
- Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define
1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...
- 条款2:尽量以const, enum, inline替换#define
原因: 1. 追踪困难,由于在编译期已经替换,在记号表中没有. 2. 由于编译期多处替换,可能导致目标代码体积稍大. 3. define没有作用域,如在类中定义一个常量不行. 做法: 可以用const ...
- NO.2: 尽量以const,enum,inline 替换 #define
1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性. 2.const XXX_XX,保证其常量性以及可控的作用域,如 ...
- 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 ...
随机推荐
- 使用CORDIC算法求解角度正余弦及Verilog实现
本文是用于记录在了解和学习CORDIC算法期间的收获,以供日后自己及他人参考:并且附上了使用Verilog实现CORDIC算法求解角度的正弦和余弦的代码.简单的testbench测试代码.以及在Mod ...
- Oracle IF-ELSE条件判断结构
关于条件判断的几个函数: 一.IF-ELSE 判断语句1.IF 语法 IF 表达式 THEN ... END IF; 输入账号名 kiki 以登陆账号 declare v_name ):='& ...
- 九十、SAP中ALV事件之四,事件子例程的参数
一.我们按照之前SAP说明里面的文字,定义好相关内容 二.上图代码对应的文档错了,重现截图一下 三.这3个子例程是不需要写调用语句PERFORM的,在SAP内部已经写好了.程序会自动根据名字找到需要调 ...
- Java IO流学习总结(转)
原文地址:http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 ...
- FFT各种模板
丑陋敬请谅解: 求两列数的卷积: 递归版: #include <stdio.h> #include <algorithm> #include <math.h> us ...
- Java中的日期表示类
一.概述 Java中的日期类设计的比较失败,刚开始使用Date来计算时间,后来大部分Date类的方法都过时了:想用Calendar类代替Date类,然而Calendar类也是不尽如人意.下面简单介绍下 ...
- 使用BurpSuite和Hydra爆破相关的服务(9.25 第十一天)
使用BP和Hydra爆破相关的服务 Hydra:九头蛇,开源的功能强大的爆破工具,支持的服务有很多,使用Hydra爆破C/S架构的服务. 使用BurpSuite爆破web服务 DVWA:web应用程序 ...
- QT多线程之---moveToThread用法
在gui编程里,一个子函数的运行时间可能过长,界面就处于假死状态,原因是窗口是一个线程,子函数也在这个线程里,一些事件也要在这个线程里处理. 如果子函数运行时间过长,系统没有办法调用事件监听循环,gu ...
- POJ 3994:Probability One
Probability One Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1674 Accepted: 1151 D ...
- java向python ,text文件动态传参或传值问题完美解决
由于业务需要对python文件进行参数传递,通过下面两个java方法完美解决此问题,我的思路是:首先我要先把上次写的参数删除,第二我要新的参数写到python文件中. 第一个方法解决了删除上次传递的参 ...