目录
一.C/C++中const的区别
1.C中的const
本质
用const修饰的是常变量,本质上仍然还是变量,只是具有常性(即不可修改),既然本质是变量,就会给其分配相应的空间
特性
1).const修饰的常变量具有常性不可被修改
2).由于本质上仍然还是变量,所以不能作为数组方括号内的数字
3).可以通过指针间接修改
4).在编译过程中,与变量拥有一样的处理方式 ,会有类型检查
5).在定义时不初始化并不会报错
2.C++中的const
本质
用const修饰的是常量,本质上就是常量,具有常性,不会为其在内存上分配空间,而是存在于符号表中,但由于C++具有兼容C的特性,所以在extern或者取地址(&)操作时,才会在内存上给其分配空间,但不会使用其存储空间的值
特性
1).本质就是常量,可以在数组方括号内使用
2).作为左值不可被修改
3).完全可以代替#define定义的宏常量,但不可以代替宏函数(宏函数在C++中由inline代替)
4).在定义时必须被初始化
5).会退化成常变量(当用变量来初始化const修饰的常量时,该常量会退化变为常变量)
6).在使用时,是在编译阶段以符号表中的值进行替换(有类型检查),并不会使用空间内的值
7).无法通过指针或者引用间接修改
二.const/#define的区别
1.区别
const常量在编译阶段替换;宏常量在预处理阶段替换
const常量有类型检查;宏常量没有类型检查
const常量在整个进程运行期间只拷贝一次(常量的值在符号表中);宏常量不会拷贝,在预处理阶段就已经全部替换了
const常量可以调试;宏常量只是简单的字面替换不可以调试
2.const的优点
在C++中,完全可以并且推荐用const代替宏常量
const常量有类型检查,方便调试,节省空间,提升效率(没有不必要的内存分配),在整个进程运行期间只拷贝一次