C++学习笔记之const与*的组合
文章目录
前言
const是一个承诺,承诺一些东西是不变的,保持const是因为实际上可以简化很多代码。const与*的组合有三种,遵循**“左定值,右定向”(左右是指const在星号的左或右)**的基本规则,如下
1. 指针常量const int * p 等价于int const *p
const在星号的左边,作为一个指针常量,p是指向常量的指针,也称为 底层const。此时不能通过*p改变这个变量的值,但变量本身可以改变值,也可以改变p的指向。
例:
int x = 2;
int y = 3;
const int *p = &x;
*p = 4; //error,不能通过*p改变变量的值
x = 4; //ok,x不是一个常量,可以改变自己的值
p = &y; //ok,指针p本身不是一个常量,可以改变p的指向。
2. 常量指针int * const p
const在星号右边,作为一个常量指针,也称为 顶层const,即指针p本身是个常量,不能改变p的指向。但可以通过*p改变所指向变量的值。
例:
int x = 2;
int y = 3;
int * const p = &x; //注:因为指针p是常量,在声明时就应该初始化。
*p = 4; //ok
x = 4; //ok,x不是一个常量,可以改变自己的值
p = &y; //error,指针q本身是一个常量,不能改变它的指向。
3. 指向常量的常量指针const int * const p或int const * const p
const int * const p(底层const)or int const * const p (顶层const),前两者的结合,即不能改变p的指向,也不能通过*p改变所指向变量的值。
例:
int x = 2;
int y = 3;
const int * const p = &x;
*p = 4; //error,不能通过*p改变所指变量的指。
x = 4; //ok,x不是一个常量,可以改变自己的值
p = &y; //error,指针p本身是一个常量,不能改变它的指向。
总结
从上面可以看出,变量本身永远可以改变自己的值,除非变量本身声明成常量const int x=2。
区别三种情况的关键:const在类型前还是在指针前。在类型前,不能通过*p改变变量的值,在指针前不能改变指针的指向,且在声明时就要初始化。
Note:const对象必须初始化,const int i =2;