[C++]谈一谈const关键字
C++中的const关键字
const关键字的作用
在编程的时候我们常常需要定义一种变量,但是这种变量的值是不变的,例如定义pi=3.14,e=2.72或者定义一种材料的弹性模量等,这时候需要用到const关键字
const pi=3.14;
const e=2.72;
const E=2.3;
另外还有一种需求,由于C++程序常由多个文件组成,有时候需要在一个文件里面定义const变量,在其他文件里面声明并使用它,这时候需要在声明和定义时加上extern关键字
//声明并定义一个const变量
extern const int buffSize=100;
//在其他文件中使用该变量的时候需要声明
extern const int buffSize;
------------------------------------
//需要注意的是,extern关键字是将变量的声明和定义分开的一种手段
//变量能且只能被定义一次,但是可以多次声明
extern int i; //声明一个变量但不定义
int i; //声明并定义
extern int i=100;
//这里会出现错误,任意包含显式初始化的声明也成为定义,抵消了extern的作用
extern const int buffSize=100;
//上面的语句可以看作一种特殊情况,同时进行了声明和定义
const的引用
C++中的引用可以看作是一个对象的别名,对const的引用也常称为常量引用,这种引用即可以绑定到常量对象上也可以绑定到非常量对象上,但是并不能将一个非const引用绑定到常量对象上
const int ci=1024;
const int &r1=ci; //将一个常量引用绑定到常量对象上
r1=42;
int &r2=ci; //错误,将一个非常量引用绑定到常量对象上
将一个常量引用绑定到非常量对象上是允许的,但是不能通过这个常量引用来修改非常量对象的值
int i=42;
const int &r=i;
r=0; //错误,利用常量引用来改变非常量对象的值
const与指针
指针和引用不同,引用不是对象,但指针本身也是一种对象,因此可以定义指向常量的指针和常量指针,当然也有指向常量的常量指针,当指针本身是个常量的时候,也称作顶层const,当指针指向一个常量的时候,称作底层const
int errNumb=0;
int *const curErr=&errNumb; //定义指向非常量对象的常量指针
const double pi=3.14;
const double *const pip=π //定义指向常量对象的常量指针
对于底层const,即指向常量的指针,同常量引用一样,也没有要求指向的对象一定是常量对象。但是在指向的对象不是常量对象时,不能通过这个指针来修改这个非常量对象的值,但可以通过别的手段来修改这个对象的值
int errNumb=0;
const int *curErr=&errNumb; //指向非常量对象的常量指针
对于顶层const,即一个常量指针,该指针本身的值不能改变,例如不能通过改变该指针的值来得到索引数组元素,但是如果指向的是非常量对象,通过该指针的值来修改其指向对象的值是完全允许的
int errNumb=0;
int *const curErr=&errNumb;
*curErr=0; //通过常量指针来修改其指向对象的值是允许的