前言

  条款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. 四元数与欧拉角(RPY角)的相互转换

    RPY角与Z-Y-X欧拉角 描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式.第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转$\gamma$,然后绕{A} ...

  2. 为Hexo Next主题添加分享及打赏功能

    博客地址:往事亦如风的博客 要想先看打赏和分享功能效果,请移步我的博客 打赏功能 因为next主题自带打赏功能,所以我们只需要在next的主题配置文件中找到如下代码,image文件夹是我在blog/s ...

  3. sql server 转置 和实现随机分配和一串代码的含义拼在一行

    1.sql server 转置很容易搜到方法,一般需要手动写转置的列项,如果多时会比较烦,下面试了省事的方法: --案例需求数据 ----方法一:if object_id('tempdb.dbo.#s ...

  4. web高并发的解决方案

    我们先了解一下什么是并发和并行 并发:并发是指两个或多个事件在同一时间间隔内发生,就是可以重叠在时间段启动,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机 ...

  5. Django学习---笔记一

    一. 新建虚拟机在虚拟中完成项目 1.新建虚拟机 mkvirtalenv  虚拟机名称 2.进入虚拟机 cd   新建的虚拟机名称 3.安装Django pip install django 4.Dj ...

  6. zookeeper-01 概述

    1. Zookeeper概念简介和应用场景 1.1.  概念简介 Zookeeper是一个分布式协调服务:就是为用户的分布式应用程序提供协调服务 A.zookeeper是为别的分布式程序服务的 B.Z ...

  7. Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

  8. 创建随机的9x9数独游戏终盘并打印

    创建随机的9x9数独游戏终盘并打印 项目github地址 1. 项目相关要求 1.1 要求 利用程序随机构造出N个已解答的9x9数独棋盘 . 输入 数独棋盘题目个数N(0<N<=10000 ...

  9. 个人技术博客--团队Git规范(参考西瓜学长)

    援引西瓜学长:GitHub团队项目合作流程 废话少说直接写 1.fork 1.对于组员来说第一步就是fork 2.点击fork之后 上面是我们的团队仓库 切换回自己的仓库 就会看到 是fork于团队仓 ...

  10. sysctl命令

    sysctl命令作用: 被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中,它包含一些TCP/ip堆栈和虚拟内存系统的高级选项,用sysctl可以读取设置超过五百个系 ...