前言

  条款02:尽量以const、enum、inline替换#define;尽可能用编译器代替不必要的预处理器。

内容

一、对于单纯常量

1、const

  有两种特殊的const,常量指针和class专属常量;

(1)常量指针

  又分为常量指针、指针常量、指向常量的指针常量;

  • const double *p;或者 double const *p;const读作常量,*读作指针,为常量指针;

  本质是个指针,是指向一个常量的指针,也即指向的内容(*p)不可变。

  • double * const p;*读作指针,const读作常量,为指针常量;

  本质是个常量,是形容这个常量的类型是指针,也即指针指向不能改变。

  • const double * const p;不管是指针的指向还是指针的指向内容都是常量,即是指向常量的指针常量。

  实际栗子解释:

const double *p = &b 常量指针;不允许 *p = 6.66,因为常量指针的指向内容是常量不可变;但是允许 p = &c。

double * const p = &b 指针常量;不允许 p = &c,因为指针常量的指向是常量不可变;但是允许 *p = 6.66。

(2)Class的专属常量

  class专属常量是指常量的作用域只在class里,需要在const的基础上再添加static关键字。

    .h头文件里声明 static const double score;

    .cpp实现文件里设初始值 const double Student::score = 66.6;

(很多编译器不支持在声明的时候设置初始值,只能将声明和设初值分开)

2、enum

  如果遇到上述“不支持在声明的时候设置初始值”,就展现了enum的必要性。

eg:

class A
{
private:
static const int LEN = ;
int score[LEN];
};

  如果编译器(错误地)不允许static整数型class常量完成 in-class 初值设定,就应该用enum来代替:

class A
{
private:
enum {LEN = };
int score[LEN];
};

二、对于形似函数的宏

  将简单的函数写成宏,能免去函数调用的一些开销,但是使用不当会得到预料之外的结果。

  有个经典的宏问题:

#define FINDMAX(a,b) ( (a) > (b) ? (a) : (b) )
FINDMAX(a++,b); //a被累加两次
FINDMAX(a++,b+); //a被累加一次

  用 inline 来代替此类宏的使用,既能免去函数调用的开销,也能避免一些不可预知的错误。

  inline 将函数“内联” 起来了,在调用的时候是编译器使用相应的函数代码替换函数调用。编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了类似#define的隐患和局限性。

template <typename T>
inline T FindMax(const T& a, const T& b)
{
return a>b?a:b;
}

总结

1、对于单纯常量,尽量用const、enum替换#define;

2、对于形似函数的宏,最好用inline函数代替#define;

Effective C++学习笔记之#define的更多相关文章

  1. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  2. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  3. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  4. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  5. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  7. Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

    Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...

  8. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  9. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

随机推荐

  1. centos6启动服务说明

    centos6启动服务说明 阅读目录 centos6.9最小化安装下的启动服务 其他服务(仅供参考,持续更新) 此表转自:参考1.参考2.另有多处补充及纠正. 1. centos6.9最小化安装下的启 ...

  2. nginx基础知识总结

    1.nginx的工作模式 master/worker工作模式: 一个master进程: 负载加载和分析配置文件.管理worker进程.平滑重启升级等. 一个或多个worker进程 处理并响应用户请求 ...

  3. Centos7.5调试/etc/sysctl.conf文件导致宕机

    今天安装greenplus数据库,需要调试一个核心文件/etc/sysctl.conf文件,结果导致系统异常宕机,出现的问题就是使用任何命令都不能输出正确的结果,只有这个显示: 不知道是什么原因,ls ...

  4. Linux运维面试题之--网页打开缓慢如何优化

    服务器负载过高或者网页打开缓慢,简单说说你的优化思路 ? 首先我们要发现问题的过程,通过操作系统,数据库,程序设计,硬件角度四个维度找到问题所在 找到瓶颈点的位置 制定好优化方案,形成处理问题的体系 ...

  5. Hive-1.2.1_05_案例操作

    1. 建库建表 # 建库 create database exercise; # 建表 create table student(Sno int,Sname string,Sex string,Sag ...

  6. Alpha冲刺 - 事后诸葛亮

    Alpha冲刺 - 事后诸葛亮 Alpha完成情况表 Stardust(安卓端) 模块 预期计划 现实进展 完成度 登录/注册 登录时,从服务器拉取的数据并同步数据库.获取的数据有:用户名.密码.记录 ...

  7. Graphviz安装及简单使用

    Graphviz Windows环境安装: 1.官网下载 官网下载地址 2.配置环境变量 将graphviz安装目录下的bin文件夹添加到Path环境变量中: 3.验证是否安装并配置成功 进入wind ...

  8. day12 Python列表

    list#类 列表概括 li = [1,2,13,["石振文",["19", 10],"庞麦郎"],"charon",& ...

  9. 手把手教你Chrome浏览器安装Postman(含下载云盘链接)(转)

    文章转自http://www.ljwit.com/archives/php/278.html 说明: Postman不多介绍,是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.本文主要 ...

  10. 使用zip.js压缩文件和解压文件

    zip.js官方网站为:https://stuk.github.io/jszip/ 在此说明,下面的例子基本上来自官方示例,大家可以做参考,官方示例地址为:https://stuk.github.io ...