C++的Const修饰符几种用法
1、const修饰符可以声明常量。
const int b=100;
2、const修饰符可以声明指针,当const在(*)号左边,意味着指针指向的数不能修改,即指针不能指向另一个值。当const在(*)号右边时,意味着指针不能修改,例如a++等操作,但是指针指向的值可以修改。
int d=10;
const int*a=&b; [1]不能进行(*a)++的操作,但是可以进行*a++操作
int const *a=&b; [2]同上
int* const a=&b; [3]不能进行a++的操作
const int* const a=&b; [4]同上
3、const修饰符修饰函数参数时,一方面可以防止输入的参数被更改,另一方面可以进行类型检查,如果输入的数类型不符合则报错。
4、const修饰符在函数后面时,可以为函数重载提供参考。同一个函数名和相同的参数列表,如果后面加了const和没有const是两个函数。
5、const在函数声明前面:
const int fun1() //这个其实无意义,因为参数返回本身就是赋值。
const int * fun2() //调用时 const int *pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针内容不可变。
int* const fun3() //调用时 int * const pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针本身不可变。
6、const在类中时,当修饰成员变量时,成员变量会变成成员常量,不能被更改,且只能在初始化列表时被赋值。当修饰成员函数时,该成员函数不能改变类的成员变量,也不能调用非const的成员函数。
7、将Const类型转化为非Const类型的方法
采用const_cast进行转换。
用法:const_cast <type_id> (expression)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
· 常量指针被转化成非常量指针,并且仍然指向原来的对象;
· 常量引用被转换成非常量引用,并且仍然指向原来的对象;
· 常量对象被转换成非常量对象。
8、const能节省空间
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。