一、const的基本使用情况
使用情况 | 格式 |
---|---|
常变量 | const 类型说明符 变量名 (可互换const和类型说明符) |
常引用 | const 类型说明符 &引用名 (可互换const和类型说明符) |
常对象 | 类名 const 对象名 (可互换const和类型说明符) |
常成员函数 | 类名::函数名(形参表) const |
常数组 | 类型说明符 const 数组名[大小] (可互换const和类型说明符) |
常指针 | 类型说明符 const *变量名 |
二、const修饰指针的情况
首先定义了一个整型变量b并给它赋值100
情况1:const位于*号的左侧,与const放在变量声明符中的位置无关
const int *a = &b;
等价于int const *a = &b;
这种情况下,const就是用来修饰指针所指向的变量,即指针指向为常量
这样,可以先不进行初始化,因为虽然指针的内容是常量,但指针本身不是常量。const int *a;
是正确的。
举个例子:假如a是一个仓库管理员,他所管理的仓库里面的货物他是没有权限去动的。
但是,也有两种办法去改变仓库里面的值:
最直接的当然是直接改变变量b的值了
间接的方法就是让a指向另外一个变量
情况2:const位于*号的右侧,const修饰指针本身,即指针本身是常量
int* const a;
,这种情况下不能对指针本身进行更改操作,而指针所指的内容不是常量
由于指针本身是常量,所以一定要在定义的同时进行初始化
情况3:星号的左右两侧都有,指针本身和指针指向的内容都是常量
const int* const a = &b;
三、与#define的区别
虽然它们都可以定义常量,但是const比#define有更多的优点:
- const常量有数据类型,而宏常量没有数据类型。
因此编译器可以对前者进行安全检查,而只对后者进行字符替换,而且在替换过程中可能有边际效应- 有些调试工具可以针对const进行调试,而不能对宏常量进行调试
四、如何修改常成员函数中类的成员变量
在类的成员变量中,用
mutable修饰成员变量名
后,就可以在const成员函数中修改成员变量的值了