const有如下几个做用:数组
1. 定义const常量,具备不可变性。eg. const int MAX = 100; int Array[MAX];函数
2. 进行类型检查,使编译器对处理内容有更多的了解,消除隐患。eg. void f(const int i){....}编译器就会知道i是一个常量,不容许修改。spa
3. 避免模糊意义的数字出现,一样何以很方便的进行参数的调整和修改。同宏定义同样,能够作到不变则已,一变都变。指针
4. 保护被修饰的东西,防止被意外修改,加强了程序的健壮性。code
5.为函数重载提供参考对象
class A { void f(int i) {...} //定义一个函数 void f(int i) const {...} //上一个函数的重载 }
6. 节省空间,避免没必要要的内存分配blog
#define PI 3.14159 //该宏用来定义常量 const double Pi=3.14159; //此时并未将Pi放入只读存储器中 double i=Pi; //此时为Pi分配内存,之后再也不分配 double I=PI;//编译期间进行宏替换,分配内存 double j=Pi; //没有内存分配 double J=PI; //再次进行宏替换,又一次分配内存
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define同样给出当即数,因此const定义的常量在程序运行过程当中只有一份复制品,而#define定义的常量在内存中有若干个复制品。
7. 提升了程序的效率。编译器一般不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与内存的操做,使得它的效率特很高。内存
引伸1:什么状况下须要使用const关键字编译器
1. 修饰通常常量。eg.int const x=2 或 const int x=2。编译
2. 修饰常数组。eg. int const a[8] = {1,2,3,4,5,6,7,8}; const int a[8]={1,2,3,4,5,6,7,8};
3. 修饰常对象。常对象是指对象常量。eg. class A; const A a; A const a;
定义常对象时,一样要进行初始化,而且该对象不能再被更新,修饰符const能够放在类名后面,也能够放在类名前面。
4. 修饰常指针
const int *A; //const 修饰指向的对象,A可变,A指向的对象不可变 int const *A; //const 修饰指向的对象,A可变,A指向的对象不可变 int *const A; //const 修饰指针A,A不可变,A指向的对象不可变 const int *const A; //指针A和A指向的对象都不可变
5. 修饰常引用。