注:转载请标明原文出处链接: https://lvxiaowen.blog.youkuaiyun.com/article/details/107008580
1 const与基本数据类型
const用来控制变量是否可以变化。
2 const与指针类型
const int * p;
//指向整形常量的指针,它指向的值不能修改。
int * const p;
//指向整形的常量指针,不能再指向别的变量,但指向(变量)的值可以修改。
const int *const p;
//指向整形常量的常量指针,它既不能再指向别的常量,指向的值也不能修改。
理解这些声明的技巧在于,查看关键字 const右边 来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。下面的代码有助于说明这一点:
const int * p1;
//the int pointed to is constant
int * const p2;
// p2 is constant, it can’t point to anything else
3 const与引用
const引用:指向const的引用,和const指针一样,const引用可以与常量绑定,也可以与变量绑定,只是不能通过const引用来改变绑定对象的值,如:
int a=10;
const int &ra=a;
a=5; //正确
ra=4;//错误,不能通过引用改变a的值
注意事项
(1) 非const引用不能与const对象绑定,因为常量a的值不可变,但可通过非const引用来改变常量a的值,这样做是错误的,如:
const int a=10;
int &ra=a;//错误,非const引用不能绑定到const对象
(2) 引用的类型必须与所引用的对象类型一致,但是有例外情况:在初始化常量(const)引用时可以用任意的表达式作为初始值,只要表达式的结果能转换成引用的类型。
int i=42;
const int &r1=i; //正确
const int &r2=42; //正确,r2是const引用
const int &r3=r1*2; //正确,r3是const引用
int &r4=32; //错误,r4不是const引用
4 const示例
5 const与 #define的比较
5.1 区别
(1) 就起作用的阶段而言:#define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。
(2) 就起作用的方式而言:#define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
(3) 就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。
(4) 从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。
5.2 const优点
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
(3) const可节省空间,避免不必要的内存分配,提高效率。
参考资料
[1] https://www.imooc.com/learn/381
[2] https://www.cnblogs.com/frustrate2/archive/2013/01/12/2857434.html
[3] https://blog.youkuaiyun.com/weibo1230123/article/details/81981384