const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
1. 修饰常量
用const修饰的变量是不可变的,(错误演示):
使用 const 修饰变量 x ,使得变量 x 变成常量,此时再修改 x 的值就会出错,禁止修改。
#include#include using namespace std;int main(void){ const int x = 3; // int const x = 3,和前一种是等价的 x = 5; // 此时x是一个整型常量,不可修改,编译出错。 system("pause"); return 0;}
2. 修饰指针
如果const位于 * 的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于 * 的右侧,const就是修饰指针本身,即指针本身是常量。因此,推荐使用int const* p,而不是使用const int* p(虽然两者意义完全一样),这样更容易理解。用 const 修饰指针变量 *p ,这样 *p 就变成常量,此时修改 *p 的值就会出错,但是修改 x 的值不会出错,
#include#include using namespace std;int main(void){ int x = 3; int const *p = &x; // const int *p 两者等价 *p = 5; // 编译报错 system("pause"); return 0;}
因为 const 修改的是指针变量 *p ,而不是地址,所以 p 是可以修改的,但是修改的时候要赋地址,不能赋1,2,3这样的数值。
#include#include using namespace std;int main(void){ int x = 3; int y = 5; int *q = &y; int const *p = &x; // const int *p 两者等价 // *p = 5; // 编译报错 p = &y; // 把y的地址赋给p ,p 指向 y ,*p = 5 cout << "*p = " << *p <
运行结果:
如果const位于 * 的右侧,const就是修饰指针本身,即指针本身是常量。
int *const p 此时 const 修饰的是 “指针p” ,p 是一个地址,也就是说这个地址是一个常量,
*p = 10 这里修改的是 指针变量 *p ,而不是 指针 p ,所以不会报错,修改之后 x 的值也会随之发生变化。
p = &y 而这里修改的是 指针 p ,也就是说修改了地址,而地址是常量,不能修改,所以会出错。
#include#include using namespace std;int main(void){ int x = 3; int y = 5; int *const p = &x; *p = 10; // 编译通过 p = &y; // 编译报错 system("pause"); return 0;}
3. 修饰引用
&z = x :z 是 x 的别名,const将 别名 z 变成常量,此时给 z 赋值就会出错,但是给 x 重新赋值是可以的
#include#include using namespace std;int main(void){ int x = 3; int y = 5; int const &z = x; z = 10; // 编译错误 system("pause"); return 0;}
4. 修饰函数参数
用const修饰函数参数,传递过来的参数在函数内不可以改变。
用const修饰函数参数的主要作用就是使不想被修改的函数参数变成常量,在函数里不能随便修改函数参数。
#include#include using namespace std;void fun (const int &a,const int &b);int main(void){ int x = 3; int y = 5; fun(x,y); cout << x << "," << y << endl; system("pause"); return 0;}void fun (const int &a,const int &b){ a = 10; // 编译出错 b = 20; // 编译出错}