这条博客基于Bo Qian的YouTube教学教程总结而成,大家可以在YouTube上找到该教程,这里做一个心得总结。
这部分,总结一下对const的认识:
学过C++的都知道,C++中的const用于修饰常量,也就意味着不可改变,你以为就是这么简单了,但是实际中const可以玩出很多花样:
1. const int *m ,int* const m 和 int const *m
其实大家除了第一种写法外,很少用后面两种写法,但是这两种都是合法的C++语法,却和第一种写法有很大的不同。const int *m 表示const修饰m指针指向的int值,也就是该指针指向的int值不可改变。
int i = 9; const int *m = &i; //compile error *m = 10; // compile success m++;
int* const m 表示m指针值为const,但是m指向的值不是,还是用代码做个演示
int i = 9; int * const m = &i; // compile error m++; // compile success *m = 10;
int const *m看起来好像更加少遇到,其实和const int *m 是一个意思,有一个非常容易记住的规律,const在指针符号*之前,则表示该值为const,否则表示指针为const。
C++中有一个cast特性,表示类型的转换,当然,const也是可以进行cast away的,举个例子,我们定义了const修饰的int值,如果我们想要修改它,也不是没有办法,C++提供了const_cast<>来将变量的const属性去除。
int main(){ const int i = 9; const_cast<int&>(i) = 10; }
但是这种操作方式不被推荐,因为const变量定义的初衷就是不想改变它。而且这种操作也不安全,容易造成很多问题。
那么我们为什么要用const呢?
1. 在设计之初定义const变量,可以在程序开发的过程中避免错误的写入,举个例子,我们在Person对象中定义了人的ID,如果你不想让ID改变,就将其定义为const,这样,如果后续有其他的程序员试图改变该变量,就会报错,这样就很好的起到了保护变量的作用。
2. 读者在看到const修饰的变量时,就知道该变量是不可变,所以起到了self documenting的作用(意思就是代码即注释)。
3. const变量的定义有利于compiler对程序进行优化,使代码更加紧凑或者是执行的效率更高。很容易理解,const在编译阶段compiler就已经知道,所以可以进行大胆的优化(因为一旦初始化后就不会改变)。
4. const在C++就是read-only memory,可以放到不可读的区域例如ROM中,其实作用和上一条说的差不多,有利于程序的编译运行。
下一篇将会介绍const修饰的function,结合C++中的OOP介绍const在成员函数修饰中的巨大作用。