1.const修饰在数据类型前
即 const typename,代码示例如下:
const int a = 10;
a = 20; //Error!无法修改,会报错
此时使用a=20无法再修改a的值,但这只是在语法层面上,禁止了通过赋值运算符的方式修改一个变量的数值,但我们仍然可以通过指针的方式进行修改
const int a = 10;
a = 20; //Error!无法修改,会报错
int* b = &a;
*b=20; //is ok!
通过指针我们成功的将*b指向的内存空间的数值修改了,此时通过cout输出a的值,可以发现a为20
二. const在 * 运算符左右两侧的差异
1.const在*的左侧,即常量指针
int b = 10;
const int* a = &b; //常量指针,int const *a =&b 与它效果相同
*a = 100; // Error!
补充:int const *a =&b 与const int* a = &b等效。
此时*a所指向内存空间的值不能改变,但a指向的对象可以改变 。
但b目前没有被const修饰,我们仍然可以通过b去修改,代码如下:
int b = 10;
const int* a = &b;
*a = 100; // Error!
b = 10000;
std::cout << *a << " " << b << std::endl;
此时用cout输出可以得到10000 10000.
2.const在*的右侧,即指针常量
int* const a = &b; //a = &c;/Error!
*a = 100; //is ok!
此时*a所指向的内存空间的值可以改变,但a指向的对象不能改变。
3.const在*的左右两侧都有,即常指针常量
以下两种语法等效:
const int * const a = &b;
int const *const a = &b;
*a指向的内存空间的值不能改变,指向的对象也不能改变。