const关键字可以修改变量、指针、函数参数等,被const修饰后意味着告诉编译器某值是保持不变的,不可以被修改(个人感觉可以理解为只读)
一、const修饰普通类型的变量
const int a = 7;
int b = a; // 正确,b是一个变量可以被修改
a = 8; // 错误,aconst修饰不能改变
a 被定义为一个被const修饰的变量,可以将 a 赋值给 b,但是不能给 a 再次赋值(被const修饰后不能修改)。其值不允许修改
PS:
很多人说,变量被const修饰后就成为了常量,其实const并不能把变量变成常量,只是表示这个变量不能被修改,不能被赋值
二、const 修饰指针变量
const修饰指针时,因为指针的结合性,所以有三种情况(PS:这部分其实可以理解为const离谁近,便修饰谁,谁就不可变)
- A: const 修饰指针指向的内容,则内容为不可变量。
- B: const 修饰指针,则指针为不可变量。
- C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
const int *p = 8; //const 修饰指针指向的内容,其内容为不可变量 int a = 8; int* const p = &a; *p = 9; // 正确 对于 const 指针 p 其指向的内存地址不能够被改变,但其内容可以改变。 int b = 7; p = &b; // 错误 指针p被const修饰 内存地址不可修改 int a = 8; const int * const p = &a; //const既修饰指针指向的内容,又修饰内存地址,所以指向a后两者皆不可再变
三、const参数传递
const修饰参数传递很简单,就是参数前增加一个const,可以参考一和二两部分(参数无非就是指针和值)
void Cpf(const int a)
{
cout<<a;
// ++a; 是错误的,a 不能被改变
}
当然,const也可以修饰函数函数,但是其本质是一样的,函数被修饰之后,其返回值不可变或返回指针内容不可变或返回指针地址不可变,但是万变不离其宗:const修饰谁,谁不可变
PS:
const修饰一级指针时很简单,但是当const修饰二级指针就很有意思了
const char **p //此时const修饰谁?
都知道,二级指针就是指向指针的指针,所以const修饰的就是**p。其实并不是,const char **p是一个指向const char *指针的指针,也就是说const修饰的是 char *,而p则是指向这个被const修饰的地址的指针
const用的最多的一个地方是修饰函数的参数,对函数的参数进行限定,防止参数内容被函数修改