首页 > 代码库 > 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):函数 中再进行讨论。