const、static、#define的区别
const和static的区别
const
翻阅C++文档的话其实会发现与const关键字相对的是volatile,这两个关键字都可以出现在任意的类型说明符中以及限定成员函数变量。
-
const 指定一个语义约束,告诉编译器该对象不可以被改变,说白了就是定义常量(constant)。在C++中const出来可以定义常量同时可以修饰非静态成员函数。主要就是不可修改,以及编译器会去判断,并报错。
- 例如在使用过程中,我想要变量
int var1为常量,就可以定义const int var1 = 100;但是有个问题,上面说了const可以出现在任意类型说明符中,那如果说,我需要定义的不仅仅是var1这么简单的一个变量,而是要定义一个指针或者一个引用,name就可能发生一下几种情
int var1 = 100; const int* var2 = &var1; int const *var3 = &var1; int* const var4 = &var1; const int* const var5 = &var1;var2和var3是修饰var3 的指针变量,var2和var3的内容可以改变,但是指针的指向不可以改变,var4和var5则是指针常量,指针指向不可改变,指针内容也不可改变。可以实验一下:
看报错就能知道大概情况了。 - 报错就好说了,我们可以用在一些比较隐含的地方,利用这一特性,以至于编译器尽可能帮我们排查代码中可能存在的错误。举个简单的例子:

在使用判断语句的时候,可能会少输入一个=,虽然在很多ide中是可以检测出这个错误,但是编译器本身是不会报错的,而加入const则会编译器报错,无法通过编译。
- 例如在使用过程中,我想要变量
-
volatile的话其实就是和const相对的。volatile和const不能同时出现,即不可以出现一下任意情况:
const volatile int var = 1; volatile const int var = 1;等情况。volatile则是明确告诉编译器这是一个易变的变量,在一般情况下,这个关键字使用与否区别不大,除非是有代码在编译器不知情的情况下修改了变量值则可能发生值得改变。在多线程的情况下这个关键字就有必要了,两个或以上的线程调用同一个变量时,可能会造成变量的值发生改变,而此时直接调用可能会发生值不正确的情况。 -
说完cv限定符(const和volatile),也就联系到另一个关键字
mutable,mutable则是将一个常量类的成员声明为可修改状态。实验一下。
从报错情况可知,定义了一个常量的数据结构,其中temp使用了mutable声明,temp的值就可以修改而num的值则不可修改,会发生报错。要注意的是此时在成员变量前声明volatile也是没有用的,必须声明mutable。
static
const常与static一起比较,不知道为何。这两个关键字之间好像并没有什么关联,可能仅仅只是在单词翻译上容易混淆。static是声明一个静态存储区,这值得注意。知道语义则容易解释static和const的区别。
- 同样还是以C++开发文档为准。static是指成员变量或者成员函数声明为静态属性或静态方法,这样可以不用创建对象也可以直接调用变量或者对象。看下实例代码
执行成功。 - 之后再看下
extern,extern一般用于 不同文件共享全局变量的时候,可以看下下面示例。


这两张图分别对应这个两个文件,使用率extern关键字,使用count全局变量和妇女函数。
#define
#define则是定义一个宏,就是在函数外定义一个替换,没有额外花销,但是可能出现bug而难以发现,使用#undef取消。

浙公网安备 33010602011771号