C++语言中可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的优点。
1、const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意想不到的错误(边际效应)。
2、有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在c++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
const修饰指针
一般分为如下4种情况:
int b = 500;
const int *a = &b //情况1
int const *a = &b;//情况2
int* const a = &b;//情况3
const int* const a = &b;//情况4
如何区别呢?
1)先看情况1
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身就是常量。因此,1和2情况相同,都是指针指向的内容为常量(const放在变量声明符的位置无关),这种情况不允许对内容进行更改操作。
换句话来说,如果a是一名仓库管理员的话,他所进入的仓库,里面的货物(*a)是他没有权限动的,仓库里面的东西原来是什么就是什么;所以
int b = 500;
const int *a = &b;
*a = 600;//错误
但是也有别的方法改变*a的值,一是通过改变b的值:
int b = 500;
const int *a = &b;
b = 600;
cout<<*a<<endl;//得到600
还有一种方法就是a指向别处;
2)情况2和情况1相同。
3)情况3指针本身为常量,这种情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量。
举例来说:如果a是一名仓库管理员的话,他只能进入指定的某仓库,而不能去别的仓库(所以a++是错误的)
;但这个仓库里面的货物(*a)是可以随便动的。(*a=600是正确的)。
###此外,对于情况3:定义试必须初始化。
int b = 500,c = 600;
int* const a;//错误,没有初始化
int* const a = &b;//正确,必须初始化
*a = 600;//正确,允许改值
cout<<a++<<endl;//错误