条款2:尽量以const,enum,inline替换#define

这一条款也被称作:宁可用编译器替换预处理器。对于一般用#defined定义的常量,可以使用const类型代替。但是要注意两种特殊情况:假如我们要在头文件中定义一个不能被修改的字符串,那么需要使用const char* const类型的指针:

char a = 'A';     
char b = 'B';  
char* const pa1 = &b;//近水楼台先得月,const离谁近就修饰谁,const 修饰pa1表明pa1的指向不能变,但是它指的值可以变
//pa1 = &a;     错误做法,表明指针的指向不能变  
*pa1 = 'C';     //可以改变指针指向对象的值  
const char* pa2 = &a;  
//*pa2 = 'B';  // 指针指向的对象是常量,不能修改  
pa2 = &b;   //可以改变指针的指向  
const char* const cptr = "const";//此时,不论是指针的指向还是指针指向的对象值都不能修改  

简言之,const修饰变量的原则就是:近水楼台先得月。const离谁近就修饰谁。

第二种情况是与类有关的。你无法通过#define来确定一个有作用域的常数,但是可以用static const来完成。比如你定义了数组长度为5,可以这样做。在头文件中:

class Test  
{  
private:  
    //记录整个所有Test类型对象调用fun函数的次数  
    static int times;  
    //数组的长度  
    static const int arraySize = 5;  
public:  
    void fun()  
    {  
        std::cout<<++times<<std::endl;  
    }   
    int Array[arraySize];    
};  

这里还有static int times变量的原因是因为它们的声明、定义完全不同!在对应的源文件中,只有

#include "item2.h"  
int Test::times = 0;  
//const int Test::arraySize;  

也就是说,对于一般的staic变量(这里是times),是在头文件中声明它是static,而在源文件中定义的;而对于static const变量,假如这个变量是“整数”类型:int,char,bool,那么直接就可以直接声明,而不用定义。#define除了定义一些常量之外,使用#define定义宏,也可以节省函数调用的开销:

#define FIND_MAX_VALUE(a,b) (a) > (b) ? (a) : (b)  
然后就可以:
int a = 10,b = 5;  
int c = FIND_MAX_VALUE(a,b);  

但是这样做有一个致命的问题:
int c = FIND_MAX_VALUE(++a,b);后c为12;而int c = FIND_MAX_VALUE(++a,b+10);后c为11!这是一件多么令人惊奇的事啊!所以,为了防止出现这种乱子,c++提供了内联函数,这种函数在调用时,会在调用点展开,开销比较小。
简而言之:如果是#define常量,用const替换;如果是为了定义类似函数的宏,则用内联函数替换。

关于我自己

  • 一个正派但不正经的程序员

  • 18年计算机专业硕士毕业生,腾讯SNG部门实习生,现加盟快手科技 ,后端研发工程师一枚

  • 喜欢技术,喜欢互联网

  • 民遥控 ,赵雷、陈粒、宋冬野

  • 公众号:编程美学,时不时写篇文章,偶尔数羊,其实说到底,只是想和你聊聊

  • 在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值