条款02:尽量以const,enum,inline代替#define

目录

1.const定义常量

2.cosnt修饰指针

3.class的专属常量

4.the enum hack

5.用inline代替#define宏函数


1.const定义常量

#define B 1.63

const int B = 1.63

原因:

1.#define是在预处理阶段,直接将代码中的B替换为1.63会产生多份,而常量不会产生这样的情况。

2.当你用#define出现错误时后,编译器可能会提到1.63,不会提到B,如果1.63来自头文件,还需要去头文件去追踪。

2.cosnt修饰指针

cosnt char*const authorname = "wys";

const 在 * 之前修饰 指针指向的内容,在*之后修饰指针变量本身。

3.class的专属常量

因为val在静态区,不在对象A内不能用初始化列表初始化,所以必须在类内声明,类外定义初始化。

新的编译器会支持在声明时初始化。

class A 
{
 public:
	 static const int size = 3;
     int arr[size];
};

//const int A::size = 3;

#define不能这么做,因为#define是无脑替换,不能提供任何封装

4.the enum hack

如果你的编译器不支持在类内初始化,可以用enum类型数值,充当int使用。

class A 
{
 public:
     enum{size = 3}; //size就成了3的记号名称。
     int arr[size];
};

enum hack比较像#define,而不是const,就像你可以用对cosnt取地址,引用,但是不能对#define取地址,引用,所以当你不想被取到常量的地址或者引用,可以用enum hack。

5.用inline代替#define宏函数

1.宏函数需要把每个实参都加上(),即使这样宏函数仍然有不确定的行为。

2.#define是无脑替换没有作用域,也不能封装。

内联函数就不用担心这样的问题,内联函数是真正的函数,会有作用域,可以封装,还有参数的检查。

template<class T>
inline int fun(const T &a, const T&b )
{
    return a + b;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值