第九讲:共用数据的保护与对象的动态处理.docVIP

第九讲:共用数据的保护与对象的动态处理.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第九讲:共用数据的保护与对象的动态处理

第九讲:共用数据的保护与对象的动态处理 本讲基本要求 ????* 掌握:常对象的定义;引入常对象数据成员的方法;对象的常引用。 ????* 理解:常对象的指针的定义及引用。 ????* 了解:对象的动态建立和释放。 重点、难点 ????* 常对象的定义;引入常对象数据成员的方法;对象的常引用。 一、共用数据的保护 ????虽然采取了不少有效的措施(如设private保护)以增加数据的安全性,但是有些数据却往往是共享的,例如实参与形参,变量与其引用,数据与其指针等,人们可以在不同的场合通过不同的途径访问同一个数据对象。有时在无意之中的误操作会改变有关数据的状况,而这是人们所不希望出现的。 ???既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const,即把有关的数据定义为常量。 1、常对象 定义常对象的一般形式为: ????类名const 对象名[(实参表列)]; ????const 类名 对象名[(实参表列)]; 二者等价。 说明: ???1、在定义对象时指定对象为常对象。常对象中的数据成员为常变量且必须要有初值,这样,在所有的场合中,对象tl中的所有数据成员的值都不能被修改。凡希望保证数据成员不被改变的对象,可以声明为常对象。 ???2、 如果一个对象被声明为常对象,则不能调用该对象的普通(非const型)的成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。 ???3、为了防止普通函数(非const型)会修改常对象中数据成员的值。在函数中并没有修改常对象中数据成员的值也不允许调用,因为不能仅依靠编程者的细心来保证程序不出错,编译系统充分考虑到可能出现的情况,对不安全的因素予以拦截。 ???4、编译系统不能进入函数去检查它的代码,看它是否修改了常对象中数据成员的值。实际上,函数的定义与函数的声明可能不在同一个源程序文件中。而编译则是以一个源程序文件为单位的,无法测出两个源程序文件之间是否有矛盾。如果有错,只有在连接或运行阶段才能发现。这就给调试程序带来不便。 ???5、现在,编译系统只检查函数的声明,只要发现调用了常对象的成员函数,而且该函数未被声明为const,就报错,提请编程者注意。 ???6、有时在编程时有要求,一定要修改常对象中的某个数据成员的值(例如类中有一个用于计数的变量count,其值应当能不断变化),ANSI 考虑到实际编程时的需要,对作了特殊的处理,对该数据成员声明为mutable。 如: mutable in count; 把count声明为可变的数据成员,这样就可以用声明为const的成员函数来修改它的值。 2、常对象成员(类) 可以在声明类时将成员声明为const,即声明常数据成员和常成员函数。 ???①常数据成员 ???作用和用法与一般常变量相似,用关键字const来声明常数据成员。常数据成员的值是不能改变的。有一点要注意:只能通过构造函数的参数初始化表对常数据成员进行初始化。 ???如在类体中声明了常数据成员hour: ??????const int hour; //声明hour为常数据成员 说明: ???不能采用在构造函数中对常数据成员赋初值的方法,下面的用法是非法的: ??????Time::Time(int h) ??????{ hour=h;} //非法, 因为常数据成员是不能被赋值的。 如果在类外定义构造函数,应写成以下形式: ???Time::Time(int h):hour(h){} //通过参数初始化表对常数据成员hour初始化在类体中声明了某一个数据成员为常数据成员后,该类的所有对象中的该数据成员的值都是不能改变的,但不同对象中的该数据成员的值可以是不同的(在定义对象时给出)。 ???②常成员函数 常成员函数的定义:类型 函数名 const 说明: ???1、如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们,例如只用于输出数据等。一般的成员函数可以引用本类中的非const数据成员,也可以修改它们。 ???2、在声明函数和定义函数时都要有const关键字,在调用时不必加const。常成员函数可以引用const数据成员,也可以引用非const的数据成员。 ???3、const数据成员可以被const成员函数引用,也可以被非const的成员函数引用。具体情况可以用下表1表示。 怎样利用常成员函数呢? ???(1)如果在一个类中,有些数据成员的值允许改变,另一些数据成员的值不允许改变,则可以将一部分数据成员声明为const,以保证其值不被改变。非const成员函数可以引用这些数据成员的值,并修改非const数据成员的值。 ???(2)如果要求所有的数据成员的值都不允许改变,则可以将所有的数据成员声明为const,或将对象声明为c

文档评论(0)

cgtk187 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档