版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
constconst关键字,C++const常量。这可不是良好的条件反射。如果只知道用const定义常量,那么相当于把仅用于制作鞭。const更大的是它const是constant的缩写const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++Useconstwheneveryouneed const如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“传递,const修饰,否则该参数将失去输出功能。const只能修饰输入参数:const修饰可以防止意外地改动该指针,起到保护StringCopyvoidStringCopy(char*strDestination,constcharstrSource是输入参数,strDestinationstrSourceconst修饰后,如果函数体内的语句试图改动strSource的内容,编译器将错误。const修饰。voidFunc1(intx)写成voidFunc1(constintx)voidFunc2(Aa)voidFunc2(constAa)A为用户自定义的数据对于非内部数据类型的参数而言,象voidFunc(Aa)这样的函数注定效率比较底。因为函数体内将产生A类型的临时对象用于参数a,而临时对象的构造、、析构过为了提高效率,可以将函数改为voidFunc(A&a),因为“传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数voidFunc(A&a)存在一个缺点:“传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰voidFunc(constA&a)。)没有必要因为内部数据类型的参数不存在构造析构的过程而也非常快“值传递”和“传递”的效率几乎相当。voidFunc(Aa)voidFunc(constA&a)。不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(intx)不应该改为voidFunc(constint&x)。2const如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数constchar*GetString(void);char*str=GetString();constchar*str=,const修饰没有任何价值。例如函数intGetInt(void)写成constintGetInt(void)同理函数AGetA(void)写成constAGetA(void),其中A为用户自定义的数据类型。AGetA(void)constA&GetA(void)的确能提class{A&operateconstA&other);//}Aab,ca,b,cAabc;//(ab)c;//a=b=c仍然正确,但是语句(a=b)=c则是的3.const任何不会修改数据成员(即函数中的变量)的函数都应该为const类型如果在编写const成员函数时不慎修改了数据成员或者调用了其它非const成员函数编译器将错误,stackGetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将GetCount函数中的错误。class{voidPush(intelem);intPop(void);intGetCount(voidconstconstintint}intStack::GetCount(void){m_num;//m_numPop();//编译错误,企图调用非const函数return}const成员函数的看起来怪怪的:const关键字只能放在函数的尾部,大概是因为const对象只能const成员函数,而非const对象可以任意的成员函数,包括成员函数const对象的成员是不可修改的,然而const对象通过指针的对象却是可以修改的const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修然而加上mutable修饰符的数据成员,对于任何情况下通过任何都可修改,自然此时const成员函数是可以修改它的为什么使用1:取代了C中的宏定义,时必须进行初始化。const限制了常量的使用方式,并没有描述常constconst最简单的常见情况就是常量的值在编译时已知而且不需要分配《C++ProgramLanguage》用const的变量虽然增加了分配空间,但是可以保证类型安全。2:须使用运算符*const。*constchar*constcpcharconstcharconst*pc1;constcharconstchar*pc2;//到constchar的指针(后两个是等同的)cpisaconstpointertochar.pc2isapointertoconst3:const将函数传入参数为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数为const,函数将不修改由这个参数所指的对象。voidFunconstA*in);voidFun(constA&in);//修饰型传入参数4:5:constConst我们也许我们也许学习过const的使用,但是对于const的细致的技术细节却不一定掌握。const的用 上只是简单的介绍,在这里我们对const进行细致的概念以及用法剖析。const是由c++采用,并加进标准c中,但是他们的意义完全不同,在旧版本(标准前)的c中,如#definePI此后无论在何处使用PI,都会被预处理器以3.14159替代。编译器不对PI进行类型检查,也 )constconst 空间 externconstint externconstint int想不为const分 constint//float constf也因此,由于无法避免为constconst#includeconstintconstintfloatcharvoid{constcharconstchar} 间的const,b是从a中计算出来的,由于a是一个b的地址,所以迫使编译器给b分配 知道了bcb 同,在c中const的意思是“一个不能改变的普通变量”,const常量总是被分 constcconstintchar得出一个错误。但是在cconstint因为cconst 空间constintpconstint的指针,它不需要初始化,因为pintconst如果希望使指针成为一个constconst*intint*constconstintintconstconstintf(){returnvoidmain(){int constint*constfunc(constint{staticintreturn}constppaanstint*funcconst(constint*constconstint*成员函数,甚至是constconstconstconst class{staticconstintint voidvoidf(void)class{mutableinti;voidnochange()voidX::nochangemutable可以用来,即使结构或者类变量为const,其某个成员也可以被修改c++的类中,如果一个函数被const修饰,那么它将无法修改其成员变量的,但是如果这个成员变量是被mutable修饰的话,则可以修改。例如struct{charname[30];mutableintaccesses;};constdataveep={"david";,0,}strcpy(,"Jimmy");//notallowedveep.accesses++;//allowedveep的const限定符程序修改veep的成员,但access成员的mutable明符表示access不受这种限制constcons constintMax=100;intArray[Max]; 例如voidf(constinti) 编译器就会知道i还是上面的例子,如果在函数体内修改了i,编译器就会报错;voidf(constinti){i=10;//error!class{voidf(int {......}file:voidf(inti)const{......}file://#definePI3.14159 constdoulbePi=3.14159;file:Pi入ROM中,而是记录在常量表中。在通常的情况下const同预处理器#define一样只是将所赋与之在符号表中定义的数值作简单的替换)constdoublei=Pi; file://Pi期间进替换,分配内存
double filedouble filedouble fileconst#define(7)编译器通常不为普通const常量分配空间,而是将它们保存在符修饰符const可以用在类型说明符前,也可以用在类型说明符后 intconst constintintconsta[5]={1,2,3,4, constint1,2,3,4,class constA Aconstconstint intconst*A;//const修饰指向的对象int*const //const修饰指针 constint*const AA修饰constdouble& 该所的对象不能被更constintFun1();constMyClassFun2();class{
intFun()在另一连接文件中const常externconstint externconstint class{constintc3=7; //err const
staticintc4=7; //err,静态数员成staticconstfloatc5=7; //errclass{A(inti=0):test(i){}constintclass{A()staticconstintconstintC++const#includevoidfunc(constint*p,intn);constchar*getStr();class{int_nA;CA(int{}inlineintgetA(){//_nAerrorC2166:lreturn}inlinevoidsetA(int{_nA=}int{usingnamespace1.const{ constinta=5;cout<<"a="<<a<<endl;//a3;errorC2166:l//int*pa&a//errorC2440:“constint*w64“int*”//int*constpa&a;//errorC2440:constint*w64换为“int*const”constint*pa1=&a;intconst*pa2=cout<<"*pa1="<<*pa1<<endl;cout<<"*pa2=//*pa13;//errorC2166:l}2.const {inta1=inta2=int*constpa=//pa&a2;//errorC2166:l*pa=cout<<"a1=}{inta=constint*pa1=&a;intconst*pa2=//*pa15;//errorC2166:la=cout<<"a=constintA=3;constint*pA=//*pA5;//errorC2166:l//A5;//errorC2166:l}{inta1=3;inta2=constint*constpa=//pa&a2;//errorC2166:l//*pa5//errorC2166:l}3.const {inta=3;func(&a,5);}4.const {//char*pgetStr();//errorC2440:“constchar*”转换为“char*”转换丢失限定符constchar*p=getStr();}5.const CAreturn0;}voidfunc(constint*p,int{usingnamespacecout<<"*p="<<*p<<endl;cout<<"n="<<n<<endl;//*p= //errorC2166:l}constchar*{return"}面向对象是Cccconst直接可以取代c中的#define,以下几点很重要,学不好也也很严重constintint constint constint 在另一连接文件中const常externconstint externconstintj=10;//,常量不可以被再次赋#defineconstlong&i=10; /*daguo提醒:由于编译器的优化,使constlongi=10;i10直接代入果,特别地用&i明确地给出了i的内存分配。不过一旦你关闭所有优化措施,即使constlongi=10;也会引起后面的编译错误。*/charh=I; char #defineSTRING"abcdefghijklmn\n"constcharstring[]="abcdefghijklm\n"; const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有intconstintdaguo说:假定对ROM编写程序时,由于目标代码的不可改写,constintiROM之外,即可实现:i通过函数初始化,而其const的常量值一定不可以被修改呢?constinti=0;int*p=(int*)&i;intconstint constint int*constp2i=ⅈ //指针p2i是常量,所指内容可修改constint*constp3i=&i;//指针p3i是常量,所指内容也是常量 //关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了东兄的const使用详解一文,对其中进行了一些补充,写下了本文。constconstintmax优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全constclass{constint…}const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可constconst数据成员的值是什class{constintsize int //错误,未知的}const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都classenum{size1=100,size2=200intint}intb=constint*a= intconst*a= int*consta=& constint*consta=& 关系,我们可以参考《Effectivec++》Item21const位于星号的左侧,则constconst位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a=3;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情a++是错误的;[4]为指针本身和指向的内容均为常非指针const常量初始化的情况:A //A为前面自定义的类类constAa=A*d=newA();constA*c=d;或者:constA*cnewAconstA&e=f; //这样作e只能为const的函数,而不能一[1]constA*c=newA();A*e=c;[2]A*constc=newA();A*b=c;另外const的一些强大的功能在于它在函数中的应用。在一个函数中,const可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:A&operator=(constA&a);voidfun0(constA*avoidfun1(constfun1()constAfun2(constvoidfun0(constA*avoidfun1(constA&constconst所修饰的constA*a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为constA&a,则不能对传递进来的对象进行改变,const修饰。[总结]对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const传递”,目的是为了提高效率。例如,将voidFunc(Aa)改为voidFunc(constA&a) 类型的数据如果是值传递,则应改成const传递,如果内部数据类型如int,char,double之类并且是值传递,则不要改成const传递。)对于内部数据类型的输入参数,不要将“值传递”的方式改为“const传递”。否则既Func(constint&x)修饰返回值的const,如constAfun2();constA*fun3(); 这样了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。constRationaloperator*(constRational&lhs,constRational&rhs) {returnRational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());}const修饰可以防止允许这样的操作发生:Rationala,b;Radionalc;(a*b)=一般用const修饰返回值为对象本身(非和指针)的情况多用于二目操作符重载函数[总结的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象的情况。const(constAtest=A实例)或某个对象的引const(constA&testA实例)const属性,则返回实例只能类A中的公有(保护)数据成员
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 军产二手房交易合同
- 乙方交易合同
- 主播与老板交易合同
- 业主撤销权物业合同
- 为啥要看物业合同
- 2026年会展入驻软件开发协议
- 2026年交通维护托管运营协议
- 2026年足球教练劳动合同(1篇)
- 介绍交易合同
- 墨西哥债劵交易合同
- 职业病尘肺防治知识培训课件
- 民族区域自治法课件
- 2025年校医考试题库及答案讲解
- 机器人技术机械臂
- 医院培训课件:《临床输血安全管理》
- 医疗垃圾分类培训考核试题(附答案)
- (国网)社会单位一般作业人-网络信息安全准入考试复习题及答案
- 常识题目及答案大全初中
- 2025年陕西高中学业水平合格考试地理试卷试题(含答案)
- 国际高中入学考-数学试题(英语试题)
- 2022省级政府和重点城市一体化政务服务能力评估报告
评论
0/150
提交评论