有时我们会定义这样一种变量,它的值不能被改变。例如用一个变量来表示缓冲区的大小,使用变量的好处是很容易对其进行调整,但为了防止程序可能改变这个值,可以用const对变量的类型加以限定:
const int bufSize =512;//输入缓冲区大小
这样就把bufSize定义成了一个常量。任何试图改变bufSize的行为都将引发错误
因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。const int k;//错误,k是一个未经初始化的常量
初始化和const
对象的类型决定了其上的操作。与非const类型所能参与的操作相比,const类型的对象能完成其中大部分,但也不是所以的操作都适合。主要的限制就是只能在const类型的对象上执行不改变其内容的操作。例如,const int和普通的int 一样都能参与算术运算,也都能转换成一个布尔值,等等。
在不改变const对象的操作中还有一种是初始化,如果利用一个对象去初始化另一个对象,则他们是不是const都无关紧要:
int i= 42;
const int ci=i;
int j=ci;
默认状态下const对象仅在文件内有效
当以编译时初始化的方式定义一个const对象时,编译器将在编译过程中把用到该变量的地方都替换成对应的值。为了执行上述替换,编译器必须知道变量的初始值。如果程序包含多个 文件则每个用了const 对象的文件都必须得能访问到他的初始值才行。要做到这一点,就必须在每一个用到变量的文件中都有对它的定义。为了支持这一用法,同时避免对同一变量的重复定义,默认情况下,const对象被设定为仅在文件内有效。当多个文件中同时出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。
某些时候有这样一种const 变量,它的初始值不是一个常量表达式,但又确实有必要再文件中共享。这种情况下,我们不希望编译器为每个文件分别生成独立的变量。相反我们想要让这类const对象像其他(非常量)对象一样工作,也就是说,只在一个文件中定义const,而在多个文件中声明并使用它。
解决的办法是,对于const变量不管是声明还是定义都添加extern关键字,这样只需要定义一次就行了:
//file_1.cc定义并初始化了一个常量,该常量能被其他文件访问
extern const int bufSize=fcn();
//file_1.h头文件
extern const int bufSize;//与file_ 1.cc中定义的bufSize是同一个
如上述程序所示,file_1.cc定义并初始化了bufSize。因此这条语句包含了初始值,所以它(显然)是一次定义。然而,因为bufSize是一个常量,必须用extern加以限定使其被其他文件使用。
file_1.h头文件中的声明也由extern做了限定,其作用是指明bufSize并非本文件所独有,它的定义将在别处出现。
note:如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步