Effective C++学习笔记之#define
前言
条款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的更多相关文章
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- 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 ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- 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 ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
随机推荐
- VMware虚拟机安装教程详解图文
学习Linux系统最好的方式就是在自己的虚拟机上安装Linux:接下来就给大家简单介绍一下VMware虚拟机的安装以及Linux的安装:VMware虚拟机只是为了更好的学习Linux: ...
- Tensorflow激活函数
注意: 1.大多情况下使用Relu激活函数这种激活函数计算快,且在梯度下降中不会卡在plateaus(平稳段),对于大的输入,也不会饱和. 2.logistic function和hyperbloic ...
- 深入 kernel panic 流程【转】
一.前言 我们在项目开发过程中,很多时候会出现由于某种原因经常会导致手机系统死机重启的情况(重启分Android重启跟kernel重启,而我们这里只讨论kernel重启也就是 kernel panic ...
- Nginx安装成Windows服务
因为有项目使用Nginx来做负载均衡,但是Nginx的Windows版本是不提供安装成服务的,所以服务器重启后Nginx并不会伴随启动和恢复.网上查了下,这里记录下解决方法,防止遗忘. 第一步:下载W ...
- 反射型XSS+文件上传+CSRF—DVWA
在学习的过程中,想到将几种漏洞进行组合练习,记录下学习过程.大佬请绕过!谢谢!! 测试环境:DVWA,安装方法参考上一篇:https://www.cnblogs.com/aq-ry/p/9220584 ...
- SQL Server2008 4064错误
无法打开用户默认数据库,登录失败,其原因是登录帐户的默认数据库被删除. 解决办法是使用管理员帐户修改此登录帐户的默认数据库. 1.使用管理员帐号登入企业管理器,在"对象资源管理器& ...
- Django复习之ORM
QuerySet数据类型: 1.可切片,可迭代 [obj,....] 2.惰性查询: ...
- swift的@objc总结
One can explicitly write @objc on any Swift declaration that can be expressed in Objective-C. @objc相 ...
- 数据挖掘十大算法--K-均值聚类算法
一.相异度计算 在正式讨论聚类前,我们要先弄清楚一个问题:怎样定量计算两个可比較元素间的相异度.用通俗的话说.相异度就是两个东西区别有多大.比如人类与章鱼的相异度明显大于人类与黑猩猩的相异度,这是能 ...
- 【转】.htaccess详解及.htaccess参数说明
.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到 ...