const使用及问题总结
2014-08-06 20:03
148 查看
const使用及问题总结
一、背景
最近在论坛中回答了一个别人提出的关于const的问题,就随着自己的理解答复了,不久就有朋友引用贴子说我说的有问题。于是乎自己思索思索、翻翻书发现自己理解的确实有问题。好记性不如烂键盘,何况记性不好,为了加深理解以及以后查询,今天就好好总结一下。二、const对象
1、定义const对象
定义一个变量代表一个常数的方法存在一个问题:可能被有意或无意的修改。const限定符提供了一个解决办法,他把一个对象转换成一个常量。const int bufsize = 512;
定义bufsize常量并初始化为512.变量bufsize仍然是一个左值,但是这个左值是不可修改的。因为常量定义后就不能修改,所以定义时必须初始化。
注意:非const变量默认为extern,要使const变量能够在其他的文件中访问,必须显示的指定它为extern(定义和声明的地方都要extern)。
2、const引用
const引用是指向const对象的引用。const int ival = 1024; const int & refVal = ival;//正确 int &ref2 = ival;//错误,将const对象绑定到非const引用可以读取但是不能修改refVal,因此不能通过使用refVal来修改ival。
const对象可以初始化为不同类型的对象或者初始化为右值。
int & r = 42;//错误, const int & x = 42;//正确同样的初始化对于非const引用却是不合法的。观察将引用绑定到不同类型时所发生的事情,最能理解上述内容:
double dval = 3.14; const int & ri = dval;编译器会把这些代码转换成如下形式的编码:
int temp = dval;//创建一个临时变量,将double类型转换成int类型 const int & ri = temp;//将ri绑定到这个临时变量如果ri不是const,那么可以给ri赋一个新值。这样不会修改dval,而是修改了temp。期望对ri的赋值来修改dval的程序员会发现dval并没有修改。仅允许const引用绑定到需要临时变量作为媒介来完全绑定过程的值,因为const引用是只读的。
非const引用只能绑定到与该引用同类型的对象。const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
3、指针和const限定符
3.1指向const对象的指针
如果指针指向const对象,则不允许用指针来改变所指的const值。因此就出现了指向const对象的指针。const double *cptr;这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而非cptr本身。也就是说,cptr本身并不是const。在定义时不需要对它进行初始化,如果需要的话,允许给cptr重新赋值,使它指向另一个const对象。但不能修改其所指对象的值:
*cptr = 42;//错误,*cptr是const的
不能使用void*保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。
可以修改const指针所指向的值,即:给这个指针赋值是合法的,而修改指针所指向的对象的内容是非法的。
3.2const指针
除了指向const对象的指针外,c++还提供了const指针----指针本身的值不能修改。int errNumb = 0; int * const curErr = &errNumb;从右向左读:“curErr是指向int类型对象的const指针”。与其它const量一样,const指针的值不能修改,这就意味着不能使currErr指向其它对象,但是可以改变它所指向的对象的值。任何给const指针赋值的行为都会导致编译错误,因此const指针必须在定义时初始化。
4、从const成员函数返回*this
在普通的非const成员函数中,this的类型是一个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的值,也不能改变this所保存的地址。const成员函数写法:
void X::func() <span style="color:#ff0000;">const</span>这时const是写在成员函数后面的。这时的this就既不能改变this所指向的值,也不能改变this所保存的地址。
相关文章推荐
- C++中const的不同使用方法及问题总结
- JfreeChart使用经验总结(分析了使用中碰到的一些常见问题)
- winpcap开发包使用中的问题总结(之二)
- 使用jdic过程中遇到的问题总结
- Oracle使用总结(三):Oracle JOB问题解决汇总
- Oracle使用总结(一):调整Oracle支持的最大进程数问题
- Eclipse+Jboss使用小问题总结
- FreeTextBox的使用问题总结
- asp.net c#.net项目中使用总结,遇到的各个问题的汇总
- 抓屏软件camtasiaf4.0.1使用问题总结
- 在C#中使用ASV封装编程实践中遇到的问题总结
- winpcap开发包使用中的问题总结
- 使用SATA硬盘的若干问题总结
- winpcap开发包使用中的问题总结
- linux下apache启动及使用的问题总结
- winpcap开发包使用中的问题总结。
- PHP5.2.X使用问题总结
- Linux下apache2+SVN环境下使用问题总结
- Python使用SOAPpy调用.net写的WebService的乱码问题总结
- 问题总结(一)使用代码调整SharePoint WebPart 视图和列表菜单