这篇博文主要是编程中的一些问题和技巧。如题目所示,这些关键字的作用不再进行描述。直接描述功能和实例代码。
首先,在头文件中对类进行定义,是不会为类分配内存空间的,在这一点上类定义可以和普通变量类型的声明匹配,这里需要理解的概念就是“声明”和“定义”,在此不再赘述。
既然类定义不会被分配内存,那显然,如下定义是错误的:
class A { private: int a = 5; };
类成员变量a想要直接定义并初始化,如果成功,显然a会被分配实际内存空间,这与类定义不符,所以上述代码编译不会通过。
接下来考虑一个场景,类成员变量中有一个数组需要被初始化,数组长度根据另一个类成员变量初始化,如何办到?
class A { private: int len = 5; //错误 int array[len]; };
这里可以有多种方式,分别描述:
一、使用#define宏定义
class A { private: #define len 5 int array[len]; };
上述代码可以完成所需功能,但由于宏定义不具有作用域的概念,在A类中定义的宏len,在A类外部甚至在其他类中都可以使用。
显然,上述的方式破坏了类的封装性,尽管能够实现所需功能,但也不提倡这样做。
二、使用const替换#define
class A { private: static const int len = 5; int array[len]; };
定义static const变量,在编译期间完成变量的初始化工作,则可以实现所需需求,同时不破坏封装性。
三、使用enum替换#define
class A { private: enum {len = 5}; int array[len]; };
使用枚举类型定义依然可以达到上述效果,并同样保证了类的封装。
结论:对于单纯常量,最好以const对象或enum替换#define
四、使用inline替换#define
这个主要是涉及内联函数展开的过程。对于形式函数的宏,尽量使用inline函数替换#define。