本文主要是介绍条款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;
}
这篇关于条款02:尽量以const,enum,inline代替#define的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!