欢迎来到天天文库
浏览记录
ID:42769604
大小:26.50 KB
页数:7页
时间:2019-09-21
《const用法详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、const用法详解面向对象是C++的重要特性.但是c++在c的基础上新增加的几点优化也是很耀眼的就const直接可以取代c中的#define以下几点很重要,学不好后果也也很严重const1.限定符声明变量只能被读constinti=5;intj=0;...i=j;//非法,导致编译错误j=i;//合法2.必须初始化constinti=5;//合法constintj;//非法,导致编译错误3.在另一连接文件中引用const常量externconstinti;//合法externconstintj=10;//非
2、法,常量不可以被再次赋值4.便于进行类型检查用const方法可以使编译器对处理内容有更多了解。#defineI=10constlong&i=10;/*dapingguo提醒:由于编译器的优化,使得在constlongi=10;时i不被分配内存,而是已10直接代入以后的引用中,以致在以后的代码中没有错误,为达到说教效果,特别地用&i明确地给出了i的内存分配。不过一旦你关闭所有优化措施,即使constlongi=10;也会引起后面的编译错误。*/charh=I;//没有错charh=i;//编译警告,可能由于数
3、的截短带来错误赋值。5.可以避免不必要的内存分配#defineSTRING"abcdefghijklmn"constcharstring[]="abcdefghijklm";...printf(STRING);//为STRING分配了第一次内存printf(string);//为string一次分配了内存,以后不再分配...printf(STRING);//为STRING分配了第二次内存printf(string);...由于const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#d
4、efine一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。6.可以通过函数对常量进行初始化intvalue();constinti=value();dapingguo说:假定对ROM编写程序时,由于目标代码的不可改写,本语句将会无效,不过可以变通一下:constint&i=value();只要令i的地址处于ROM之外,即可实现:i通过函数初始化,而其值有不会被修改。7.是不是const的常量值一定不可以被修改呢?观察以下一段代码:c
5、onstinti=0;int*p=(int*)&i;p=100;通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值。8.请分清数值常量和指针常量,以下声明颇为玩味:intii=0;constinti=0;//i是常量,i的值不会被修改constint*p1i=&i;//指针p1i所指内容是常量,可以不初始化int*constp2i=ⅈ//指针p2i是常量,所指内容可修改constint*constp3i=&i;//指针p3i是常量,所指内容也是常量p1i=ⅈ//合法*p2i=1
6、00;//合法关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文。1.const常量,如constintmax=100;优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)2.const修饰类的数据成员。如:classA{constintsize;…}const数据成员只在
7、某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const数据成员的值是什么。如classA{constintsize=100;//错误intarray[size];//错误,未知的size}const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现。如classA{…enum{size1=100
8、,size2=200};intarray1[size1];intarray2[size2];}枚举常量不会占用对象的存储空间,他们在编译时被全部求值。但是枚举常量的隐含数据类型是整数,其最大值有限,且不能表示浮点数。3.const修饰指针的情况,见下式:intb=500;constint*a=&[1]intconst*a=&[2]int*consta=&[3]constint*consta=&[4]如果你能区分出
此文档下载收益归作者所有