
const基础知识
最初,我们队const的基础理解就是只读。他所修饰变量是不能被修改的。
我们看一下他修饰变量和指针时候的使用:
1 | const int a; |
合理的利用const,指针做函数参数,可以有效的提高代码可读性,减少bug;清楚的分清参数的输入和输出特性。这些都是使用const的好处。
事实上我们应该尽量多使用const。
C中的冒牌货
理解一下下面的C语言代码:
1 |
|
我们看到a是const定义的,但是它却可以改变,因为我们使用了指针,所以我们称C语言中的const是“冒牌货”,因为它没有做到我们的想要的,变量不能改变的需求。
而在C++中,输出都是10;
原因是:
C++编译器对const常量的处理,当碰见常量声明时,将常量放入符号表中,编译过程中若发现使用常量则直接以符号表中的值替换。如果编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间,这是一种兼容C的表现。C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。这就是为什么第二次输出还是10,因为他取的是符号表中的。
const声明的变量在符号表中,这导致了下面的情况
1 | int &a = 1;//错误,a是变量,要引用变量。 |
结论:
C语言中const变量是只读变量,有自己的存储空间
C++中的const常量可能分配存储空间,也可能不分配存储空间 ;当const常量为全局,并且需要在其它文件中使用;当使用&操作符取const常量的地址时会分配。
const和#define相同之处
C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。
在const修饰的常量编译期间,就已经确定下来了。这是C++中的const和#deifne的相同之处。
1 |
|
const和#define不同之处
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换
1 |
|
练习
1 |
|