C++中多才多艺的 const
1. 定义一个常全局变量1constintglobal 100;// 初始化之后不可再赋值这样的global实际上是一个常量这是C用来取代宏定义的其中一种措施const常量有类型检测提高编译器的效率。2. 定义常指针这有两个版本分别是123constint*p1 a;// p1不能修改它所指向的目标intconst*p1 a;// p1的另一种等价形式int*constp2 a;// p2本身不可修改上述代码中的p1经常被用作函数参数用以限制指针的权限在安全性方面功不可没。p2用的很少我们很少需要一个本身指向不可变的指针3. 定义一个STL的常迭代器这也有类似的两个版本123vector::const_iterator it1;// it1不能修改它所指代的目标对象constvector::iterator it2;// it2本身不可修改由于迭代器实际上就是广义指针因此it1实际上相当于上述代码的p1it2相当于上述代码的p2同理it1用的较多用来限制迭代器的权限。4. 定义一个类的内部常成员包括常成员数据和常成员方法1234567891011classtext{constintaconst 100;// 常成员数据必须初始化voidfunc(void)const;// 常成员方法只能由常对象调用staticintastatic;};类的常成员数据aconst意味着类对象无法对其修改这个很容易理解。至于类的常成员方法func就破费脑力了语法上的理解是func不能修改任何一个类对象的bit这是显而易见的这也正是C标准对const成员方法的定义。\来近距离看看func方法的使用1234567891011inttext::astatic 100;// 类外初始化静态数据voidtext::func(void)const// 类外定义const成员方法{astatic 200;// 没毛病astatic不是对象数据此处可以被修改aconst 200;// 错误const型函数不可修改类对象数据}定义如上的成员方法很重要因为它明确地告诉了类的使用者哪些函数可以修改类对象信息哪些不会修改类对象信息。像func()这样的函数const成员方法只能被常对象调用以确保不违反权限紧缩原则比如1234text t1;// 普通对象t1consttext t2;// const型对象t2t1.func();// 错误普通对象不可调用常成员方法t2.func();注意函数本体的const属性是可以被视为重载的依据的换句话说如果以上类text提供了non-const版本的func函数那么t1将会自动调用non-const那个版本。以上陈述似乎平淡乏味但考虑C语法规定的这种bit-wise特性的常成员在处理类成员指针并且指针指向类外部内存时情况也许会变得有趣。5. bit-wise和logical-wise常特性所谓bit-wise constness指的是类对象的内部内存意义上只读约束而loigcal-wise指的是逻辑意义上的只读约束。编译器没有智能它只能实现bit-wise意义上的约束下面的例子讨论const成员operator[ ]的表现可以帮助理解12345678910111213classtext{... ...charoperator[ ](intpos)const;private:char*p;};// const关键字保证了该成员方法只能被 const 对象调用chartext::operator[ ](intpos)const{returnp[pos];}上述代码中类text存储真正字符串的地方是指针 p 指向的内存区域假设此时定义一个const型的常对象那么它只能保证类内部信息也就是p本身不被修改却无法保证其所指向的内存区域的安全性。来看下面的代码123consttext ct(abcd);ct[0] A;// 一个被编译器允许却跟逻辑相悖的语句此处ct是一个const型对象从字面理解出发我们应该认为ct对象是一个常量我们应该无法通过任何方式修改其内部信息但可惜ct里面的字符串信息实际上并不存在在类内存区域中于是就出现了可以对一个const型对象进行赋值的有趣现象。解决以上问题也不难可以改写 operator[ ] 成员方法的返回值类型1constcharoperator[ ](intpos)const;此时就再也不能对 ct[0] 赋值了但这只是个个例关键我们要掌握的内容是如果我们的类对象拥有成员指针那么一般意义上的const成员方法只能保证bits-wise的常量性即保证类对象内部的内存信息不被修改但无法保证所谓的logical-wise的常量性即保证逻辑上哪些信息不被修改。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2638840.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!