首页 > 代码库 > C++笔记(2):const限定符的用法

C++笔记(2):const限定符的用法

1.定义和初始化

a).const限定符的作用是把一个对象转换成一个常量,const的使用在一定程度上可以提高程序的安全性和可靠性。

const int bufSize = 512; int const bufSize = 512; 

以上两种定义完全是等价的,都使得bufSize成为一个值为512的常量,但它仍是一个左值,只是不能修改而已。 需要注意的是,由于常量在定义后就不能被修改,所以定义时必须初始化。

b).使用其他已有值的变量也可初始化const变量。

 int cnt = 0; const int sz = cnt;    //cnt是一个右值,sz绑定了这个值

c).非const变量默认为extern,而const变量则不是。要使const变量能够在其他的文件中被访问,必须显示地指定为extern。

2.引用

a).const引用是指向const对象的引用,不能通过使用const引用来修改所绑定的对象,非const引用不能绑定到const对象。

const int i = 256; const int &r1 = i;    //正确 int &r2 = i;          //错误:非const引用不能指向const对象 

b).const引用可以绑定到不同但相关的类型的对象或右值,比如:

const int &r = 100;      //绑定到字面值常量 int i = 50;   const int &r2 = r + i;   //绑定到右值 double dVal = 3.1415;   const int &ri = dVal;    //整型引用绑定到double类型   

编译器会把后面两行情况中的代码转换成如下形式的编码:  

int temp = dVal;        // 创建一个临时变量temp   const int &ri = temp;   // ri与temp的值绑定 

3.指针

a).指向const对象的指针 const限定了这种指针所指向对象必须是const的,而指针本身不是。也就是说可以修改cptr使其指向另一个const对象,但不能通过cptr修改所指向对象的值。而非const指针不能指向const对象。

const int i = 128; const int *cptr = &i;    //正确 int *ptr = &i;           //错误:ptr不是const指针 

允许把非const对象的地址赋给指向const对象的指针,例如:

double dVal = 3.14;          const double *cdptr = &dVal; 

此时可以修改dVal的值,但不能通过cdptr修改dVal的值。可以这么说,指向const对象的指针“自以为指向了const对象”。

b).const指针 不能修改const指针指向的对象,但可以通过该指针修改所指向对象的值。

int iVal = 10; int *const rVal = &iVal; *rVal = 20;    //正确; 

c).指向const对象的const指针 既不能修改指针所指向对象的值,也不能修改指针的对象。

const double pi = 3.14159; const double *const pi_ptr = π 

d).typedef

typedef string *pstring; const pstring cstr;

这里的第二行其实等价于:

string *const cstr; 

因为pstring是一个指向string类型对象的指针类型,const所修饰的是pstring,而非其所指对象。

 

关于const的用法就写到这里,其在函数中的应用会在 C++笔记(3):函数 中再进行讨论。