const
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性
const的作用:
-
定义const常量
-
便于进行类型检查,const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误
void f(const int i) { .........} //对传入的参数进行类型检查,不匹配进行提示
-
可以保护被修饰的东西,避免被修饰东西的改变,可以增强程序的健壮性。
void f(const int i) { i=10;//error! } //如果在函数体内修改了i,编译器就会报错
-
可以很方便地进行参数的调整和修改,同宏定义一样,可以做到不变则已,一变都变
-
为函数重载提供了一个参考,
class A { ...... void f(int i) {......} //一个函数 void f(int i) const {......} //上一个函数的重载 ...... };
-
可以节省空间,避免不必要的内存分配,const定义常量从汇编的角度看,只是给出了对应的内存地址,而不像#define直接给出立即数,故const定义的常量在运行过程中只有一份拷贝,而后者在内存中有多个拷贝。
#define PI 3.14159 //常量宏 const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ...... double i=Pi; //此时为Pi分配内存,以后不再分配! double I=PI; //编译期间进行宏替换,分配内存 double j=Pi; //没有内存分配 double J=PI; //再进行宏替换,又一次分配内存!
提高了效率,编译器通常是不为普通const常量分配存储空间,而是把它归到符号表中,这使得它成为编译时期的一个常量,没有存储和读内存的操作,使得它具有较高的效率。
const的使用
- const修饰基本数据类型
表示常量,必须进行初始化,其初始化可以归结为两种类型:
编译时初始化:const int a = 1,编译器会将所有用到a的地方都替换成对应参数,同时编译器不会为常量a分配内存;
运行时初始化:初始值不是常量表达式,比如const int a = get_size();
(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。TYPE const ValueName = value; const TYPE ValueName = value;
(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.extend const int ValueName = value;
- const修饰引用
表示对常量的引用,不能通过此应用修改它所指向的对象,只是限定了这个操作,并未限制它所指向的对象(此对象可以是非const的)。 - const修饰指针