写在前面
这一篇博客总结一下我对于C++中const限定符的理解。由于我学习年限不长,所以不能添加很多自己实际经验的理解,所以这篇博客主要是自己查阅网上的一些资料,对资料进行整合、分类、理解,然后整理的一篇博客。一方面能帮助自己更好的理解这个灵活的限定符,另一方面提供一些自己的简单的理解。还望多多批评指正。
参考文献:
- C++ 中的 const 详解
- 《C++ Primer 中文版》
- 关于C++ const 的全面总结
- const的用法及其重要性
- C++中函数名前后加const
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
const限定符定义
《C++ Primer》中是这样定义的:“有时我们希望定义这样一种变量,它的值不能被改变”,“另一方面,也应随时警惕防止程序一不小心改变了这个值。为了满足这一要求,可以使用关键字const对变量的类型加以限定”。所以可以看出const限定符的作用是:
- 告诉编译器与外部引用者,const限定符修饰的变量或者对象的值,不能改变。
const与define
仅仅考虑对于变量,要想让变量的值不改变,可以使用const,也可以使用define宏定义。如代码如下:
#define MAX 10000
//OR
const int MAX=10000;
那么,看上去二者实现功能一样,都是让MAX的值一直为10000,有何区别呢?
如果使用#define,那么如果出现错误,编译器并不会提示MAX,因为在预处理阶段已经把MAX替换成了10000,因此编译器会莫名其妙的提示10000这个数字出现了错误,从而不利于程序debug,但是如果使用const int MAX=10000,程序后面尝试修改MAX变量,编译器就会准确的提示MAX有错误,从而可以轻易地定位。
const修饰变量
const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。
const TYPE ValueName = value;
TYPE cosnt ValueName = value;
注意: 因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。
注意: 默认状态下,const对象仅在文件内有效。当以编译时初始化的方式定义一个const对象时,编译器将在编译过程中把用到该变量的地方都替换成对应的值。所谓如果程序包含多个文件,而且多个外部文件(非const定义文件)有用到const变量,即在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。
//file_1.cc定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufSize = fcn();
//file_1.h头文件
extern const int bufSize;
const修饰引用
可以把引用绑定到const对象上,const对象与其他对象一样,这称为对常量的引用。代码示例如下:
const int c1 = 1024;
const int &r1 = c1;
引用的类型必须与其所引用对象的类型一致。但是这里有例外:可以运行常量引用绑定非常量的对象、字面值,一般表达式,实例代码如下: