const意味着“只读”,属于修饰符,所以看它的作用,关键是看const修饰的位置在哪。
1、const int a与int const a
这两个的作用是一样的,因为a都是一个常整数。所以a都不能被重新赋值。eg.
const int a = 20;//此时输出a,结果为20
int const a = 20;//此时输出a,结果为20
a = 30;//这是不允许的,会报错,因为a不能被重新赋值
2、const int *a
这里const修饰的是int,而int定义的又是一个整型数,a是一个指向常整型数的指针。所以整型数不能被修改,即*a不能被重新赋值,而指针可以被修改,使其指向另一个地址空间。eg.
const int *a = 0;//此时输出*a,结果为0
int b = 1;
a = &b;//此时输出*a,结果为1
b = 20;//此时输出*a,结果为20
*a = 20;//这是不被允许的,会报错,因为*a被const修饰,不能重新赋值
3、int *const a
这里const修饰的是a,a是一个指向整型数的常指针。所以指针不能被修改,但所指向的地址的值是可以被修改的。这有点和const int *a有点相反的意思。eg.
int b = 1;
int *const a = &b;//此时输出*a,结果为1
b = 20;//此时输出*a,结果为20。可以使用*a = 20来代替
a = &b;//这是不被允许的,会报错,因为指针a被const修饰,指针不能被修改
4、int const * const a
a是一个指向常整型数的常指针,所以指针不可被修改,指针指向的整型数也是不可以被修改的。eg.
int b = 1;
int c = 2;
float d = 3.0;
int const * const a = &b;//此时输出*a,结果为1
b = 20;//此时输出*a,结果为20
a = &c;//这是不被允许的,会报错,因为指针a不能被改变
*a = d;//这也是不被允许的,会报错,因为指针a指向的整型数也是不能被修改的
int const * const a也可以写成const int* const a,它们的作用是一样的。
5、总结
- const离谁近,谁就不可以被修改;
- 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。这样可以减少bug的出现。欲阻止一个变量被改变,可以使用 const 关键字;
- 在定义 const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
- 对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
- 在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
- 对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量。