const限定符 浅谈
一、什么是const限定符
在编写c++程序时,我们有时候希望定义一种变量,他的值不能够被更改,这个时候我们就可以使用const限定符进行限定。
1、const 初始化
由于使用const限定符定义的变量的值不允许被修改,所以在创建之初就必须对其进行初始化。
const int a = init(); //正确
const int b = 10; //正确
const int c = k; //错误,k不是一个初始化的常量
我们可以使用const修饰的变量进行与非const变量一样,除了少数能够改变变量内容的大部分操做,比如基本的算数运算,转换为布尔等等。值得一提的是,当我们用const对象去初始化另外一个对象时,对方是不是const 变量都没有关系。当我们拷贝一个值到另外一个对象时,当拷贝完成后,新的对象和原来的对象就没有什么关系了。
int a = 10;
const int b = a;
int c = b; //b的值拷贝给了c
编译器在对程序进行编译的过程中,如果遇到了const变量时,会在编译阶段就获取其值,并且将文件中所有该变量都替换成其值,所以为了做到这一点,文件中必须有这个变量 的定义,基于此,在默认情况下const对象的作用域仅在该文件中,所以当你在不同的文件中看到了用const关键字修饰的同名变量时,也不要奇怪。如果我们不希望在每个文件中都定义一个const 的话,解决办法是使用extern关键字去修饰const 变量,不管是声明还是定义。
extern const int a = fun_init();
2、const 引用
我们可以将引用绑定到const对象上去,使用方法与普通变量一样,他们的区别是不允许通过修改引用来修改变量的值。另外,我们也不能使用非常量引用去指向一个常量值。
const int a = 10;
const int &r1 = a; //正确
r1 = 12; //错误,不能够修改r1,也就是a的值
int &r2 = a; //错误, 不能使用非常量引用去指向一个常量值
让我们来看看一种特殊的情况,当一种常量引用被绑定到了另外一种类型会发生什么
double a =1.234;
const int &b = a;
这里int 型b,作为引用绑定到了double型 a 上,编译时会进行如下操作
const int temp = a;
const int &b = temp;
我们可以看到,编译时计算机会自动生成一个临时变量来完成类型的转换,由此我们可以想到,当b不是一个const变量时,我们就可以对b进行修改,但是修改的是临时变量,而不是a,这不是我们想要的。
我们必须要认识到的是,我们在定义常量引用时,我们定义的是引用可进行的操作,但是我们引用的那个值可以不是一个常量。
int a = 1;
int &b = a;
const int &c = a;
b = 2; //正确
c = 2; //错误,c是一个引用常量,不能够通过c改变a 得值;
3、const 指针
与引用一样,指针也可以指向常量,但是不允许通过指针去改变常量的值,并且能够存放常量的地址的,只能是使用指向常量的指针。有一点不同的是,指向常量的指针可以指向非常量,但是不能通过指针改变指向对象的值。
const int a = 10;
const int * c = &a; //正确
int* d = &a; //错误
double test = 12;
const double* ptr = &test; //正确,但是不可以通过ptr改变test的值,尽管test可以改变
与引用不同的是,指针本身也是一个对象,所以允许我们将指针本身定义为常量,常量指针必须被初始化。常量指针存储的地址将再也不许被更改,定义方式如下
const int a = 12;
int *const ptr = &a; //ptr将一直指向a
注意:常量指针并不代表不能够修改所指对象内容,这取决于所指内容的对象类型。