第09章类域友元运算符重载.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第09章类域友元运算符重载.ppt

第9章 类域、友元、运算符重载 第8章中介绍了C++中面向对象编程的基本概念,讨论了类的定义、实现以及对象的创建和组织,特殊数据成员和函数成员的用法等,本章将在前文介绍的基础上,探讨关于对象的一些深层次内容。 9.1 类作用域 作用域可分为类作用域、类名的作用域以及对象的作用域几部分内容。 在类中定义的成员变量和成员函数的作用域是整个类,这些名称只有在类中(包含类的定义部分和类外函数实现部分)是可见的,在类外是不可见的,因此,可以在不同类中使用相同的成员名。另外,类作用域意味着不能从外部直接访问类的任何成员,即使该成员的访问权限是public,也要通过对象名来调用,对于static成员,要指定类名来调用。 如果发生“屏蔽”现象,类成员的可见域将小于作用域,但此时可借助this指针或“类名::”形式指明所访问的是类成员,这有些类似于使用“::”访问全局变量。来看一段示例代码9-1 9.2 类定义的作用域与可见域 和函数一样,类的定义没有生存期的概念,但类定义有作用域和可见域。 使用类名创建对象时,首要的前提是类名可见,类名是否可见取决于类定义的可见域,该可见域同样包含在其作用域中,类本身可被定义在3种作用域内,这也是类定义的作用域: (1)全局作用域 在函数和其他类定义的外部定义的类称为全局类,绝大多数的C++类是定义在该作用域中,我们在前面定义的所有类都是在全局作用域中,全局类具有全局作用域。 (2)类作用域(类中类、嵌套类) 一个类可以定义在另一类的定义中,这是所谓嵌套类,举例来说,如果类A定义在类B中,如果A的访问权限是public,则A的作用域可认为和B的作用域相同,不同之处在于必须使用B::A的形式访问A的类名。当然,如果A的访问权限是private,则只能在类内使用类名创建该类的对象,无法在外部创建A类的对象。见代码9-2 (3)块作用域 类的定义在代码块中,这是所谓局部类,该类完全被块包含,其作用域仅仅限于定义所在块,不能在块外使用类名声明该类的对象。见代码9-3 (4)类名也存在覆盖 和普通变量的覆盖原则一样,类名也存在“屏蔽”和“覆盖”,不过,依旧可使用作用域声明符“::”指定具体使用的类名,如“::类名”访问的是全局类,使用“外部类::嵌套类”访问嵌套类。 9.3 对象的生存期、作用域和可见域 类名无生存期,只有作用域和可见域。 对象有生存期,对象的生存期也是对象中所有非静态成员变量的生存期,这些成员变量都随着对象的创建而创建,随着对象的撤销而撤销。 对象的生存期、作用域和可见域取决于对象的创建位置,同样有全局、局部、类内之分,和前面关于普通变量的介绍并无区别,这里便不在赘述。 关于对象创建有几点问题需要强调。 9.3.1 先定义,后实例化 类的定义一定要在类对象声明之前,因为编译器要知道需要为类分配多大的内存空间,仅仅对类进行声明是不够的,如: class B; //声明 B objectB; /创建B类的对象。错误 class B { …… }; //B类定义 但是,如果不创建B类的对象,而仅仅是声明一个指向类型B对象的指针(或引用),是可行的。如: class B; //声明 B* pB=NULL; //创建B类的对象。正确 B* pC=new B; //创建B类的对象。错误 class B { …… }; //B类定义 见备注代码 9.3.2 对象内存释放与堆内存 一种普遍的误解是“如果对象被撤销,其占据的内存空间被释放,那么对象创建时和函数执行中通过new和malloc申请的动态内存也会被自动释放”,实际上,除非显式地用delete或free释放,申请的动态内存不会随着对象的撤销而撤销,相反,撤销了对象,却没有释放动态内存反而会引起内存泄露。 当然,在程序结束时,操作系统会回收程序所开辟的所有内存。尽管如此,还是要养成new/delete、malloc/free配对的编程习惯,及时释放已经无用的内存。 9.4 友元 一般来说,类的私有成员只能在类的内部访问,类外的函数是不能访问它们的。 但是,可以将一个函数定义为类的友元函数,这时该函数就可以访问该类的私有成员了。 同时,也可以把另一个类B定义为本类A的友元类,这样B类就可以访问A类的任何成员了。 下面来具体讨论友元函数和友元类的概念。 9.4.1 友元之非成员函数 在类的定义中用friend声明了一个外部函数或其他类的成员函数(public和private均可)后,这个外部函数称为类的友元函数。 友元函数声明的基本格式为: friend 函数原型; 友元函数中可访问类的private成员。 用下面的比喻形容友元函数可能比较恰当,将类比作一个家庭,类的private成员相当于家庭的秘密,一般的外人是不允许探听这些秘密的,只

您可能关注的文档

文档评论(0)

ziyouzizai + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档