const变量初始化
为了防止程序不小心改变变量值,可以用const对变量类型加以限定
例如:
const int a = 152; // const对变量类型加以限定标准格式
a = 128; // 错误,不能改变const修饰过的变量的值
- 因为const变量一旦创建之后,其值就不能改变,所以需要在创建的时候对其初始化(赋值)
const int b = 152; // 正确
const int c; // 错误,c是一个未经过初始化的常量
const类型的变量与正常的变量相似,都能参与加减乘除运算,只是const类型变量的值,不允许被改变
- 如果用一个变量去初始化另外一个变量(也就是拷贝),则它们是不是const类型的变量都无所谓
int i = 42;
const int ci = i; // 正确,i赋值给ci
int j = ci; // 正确,ci是一个常数,赋值给i
尽管ci是一个const修饰的整型变量(下面用整型常量表示),但ci本质上就是一个常数,因此可以赋值给j。
- 简而言之,ci的常量特征只有在改变ci的值时,才会发挥作用。否则,把它当作是一个整型变量就好了
const的引用
当我们引用const变量时,可以称为常量引用
const int ci = 1024;
const int &r1 = ci; // 等号两边数据类型要一样
r1 =42; // 错误,不允许修改ci的值
int &r2 = ci; // 数据类型不同,ci是整型常量,而r2是一个整型变量,这和赋值时不一样
引用的基本使用
作用: 给变量起别名
语法:
数据类型 &别名 = 原名
对const的引用,通常可以称为常量引用
int i = 42;
const int &r1 = 42; // 正确
const int &r2 = i; // 允许将const int &绑定在一个普通int对象上
int &r3 = r2*2; // 错误,r4是一个普通的非常量引用
注意观察r2、r3,我们可以将int引用为const int
,反之则不行。并且,常量引用(const int &
)仅对引用允许的操作做了限定,对引用对象本身是不是常量未作限定
int i = 42;
int &r1 = i;
const int &r2 = i; // 引用i为r2,但不允许通过r2修改i
r1 = 0; // 正确,r1是变量不是常量
r2 = 0; // 错误,r2是常量
在上面代码中,允许r2引用(非常量)整数i,但不允许通过r2修改i的值。但是,我们可以通过修改r1的值,来修改i的值
指针和const
指针常量
与引用一样,可以令指针指向常量,则称为指向常量的指针(或者指针常量),它要求不能改变所指的对象的值
const double pi = 3.14;
double *ptr = π //错误,ptr是变量,pi是常量
const double *cptr = π //正确,这就是一个指向常量的指针
*cptr = 42; //错误,不能改变所指的对象的值
常量指针
又称为常量指针,要求不能改变存放在指针中的地址。
把*放在const关键字前,说明指针是一个常量,表示不变的是指针本身,而不是指向的那个值
int errNumb = 0;
int *const curErr = &errNumb; // curErr一直指向errNumb所在的地址
const double pi = 3.1415;
const double *const pip = π
对于int *const curErr = &errNumb;
,可以从右往左阅读,离curErr最近的符号是const,说明curErr本身是一个常量,const下一个是*,说明curErr是一个常量指针,最后int确定了curErr指向的是一个int类型的变量。
同理,pip也是一个常量指针,指向的是一个const double类型的变量