c++之const详解
关于const
首先我们要明确一个定义!const修饰的是变量!而不是类型!
const的关键字的含义是常量的,常数的,不变的意思
const int a = 0;
int const a = 0;
int cosnt a;//常量不进行初始化就会报错!
上面的两种写法都是一样的!因为const都时修饰变量a!int也是修饰变量a,所以它是一个int类型的恒常变量!恒常变量一开始就要初始化!因为本身就是无法修改的,一开始不在定义时候进行初始化的话,以后就都无法进行初始化
int const *a;
const int *a;
上面这种写法也是一样的,那么const修饰的是什么呢?我们可以怎么理解,a是一个指针变量*a 就是它指向的内容!那么const实际修饰的就是指针a指向的内容!它修饰的不是a本身,而是a指向的内容!a本身可以改变!但是a指向的内容可以改变
int* const a = 0;
const int* b;
a = b//会报错
*那么这个也很容易的看出来,const修饰的是a本身,a的类型为int,所以是一个指针常量!(记得常量要一开始就是初始化)a本身是不可以改变的!但是a指向的内容是可以改变的!b无法赋值给a是因为b的类型为const int * **
const int* const a;
**第一个const修饰的是 *a 就是a指针指向的内容!第二个const修饰的是a本身!这样子a本身和a指向的内容都无法进行修改! **
==再次强调一下,const修饰的是变量!不是类型!==
const在typedef和宏中使用的差别!
#define int* INT
typedef int* int_ptr;
const INT a;
const int_ptr a;//这个会报错!
cosnt int_ptr* a;//这个可以编译通过!
cosnt int* a;
对于宏,宏本质就是一个替换,在预编译阶段就将宏定义的内容与宏进行替换!所以
==const int* a 与 const INT a是相同的!==
但是typedef不一样!typedef是一种严格的数据封装,只是将类型取一个别名而已!
也就是说 int_ptr此时是一个int* 类型的别名!
而类型里面的*是不会去和变量a结合的!
所以const真正修饰的是a!
typedef int* int_ptr;
const int_ptr a = 0;//这个的真正类型是int* const a!不是const int*a
const int_ptr *a;//这个修饰的就是*a 是a指向的内容!内容的类型是const int*
关于typedef的补充!
typedef int myint;
unsigned myint a;//报错!
#define INT int
unsigned INT a;//通过
由于typedef是一种严格的数据封装,它只引入了类型而没有引入unsigned myint类型,也就是说,通过typedef的声明,编译器只能识别myint类型。而unsigned myint既不是基本类型也不是经过typedef声明过的类型,编译器就无法识别。
unsigned是对int类型的扩展,而不是作用于变量!==所以不像const一样可以使用!const修饰的是变量!==