06-第6章深入类和对象-MJLIU分析.ppt

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

* * * * * * * * 隐含于每一个类的成员函数中的特殊指针。 明确地指出了成员函数当前所操作的数据所属的对象。 当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针 * * * * * * * * * * * * * * r是形参, * * 常成员函数 使用const关键字说明的函数。 常成员函数不更新对象的数据成员。 常成员函数说明格式: 类型说明符 函数名(参数表)const; 这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。 const关键字可以被用于参与对重载函数的区分 通过常对象只能调用它的常成员函数 * * * * * * * 6.4 对象和指针 2. 类成员指针的使用 在使用类成员指针之前,必须对其进行初始化。给指向类成员指针的初始化工作可以发生在定义类对象之前。下面的代码完成了指针与类成员的绑定: ptr = X::b; fptr = X::f; 6.4 对象和指针 由于没有对象产生,因此ptr和fptr将不知道自己作用在哪个对象上,因而这种初始化工作只是形式上的关系确定。要使指针发挥作用,必须定义对象,然后使用成员选择运算符.*或-*来完成操作。 void fun() { X Obj; X *pObj = Obj; ? ptr = X::b; fptr = X::f; ? Obj.*ptr = 2; //Obj.b = 2 ++ pObj-*ptr; // ++Obj.b ? (Obj.*fptr)(); //call Obj.f(); (pObj-*fptr)(); ? fptr = X::g; (Obj.*fptr)(); //call Obj.g() } 代码 Obj.*fptr() 是错误的。因为这会首先解释为 Obj.*(fptr()) 这就意味着,fptr是个函数,并将它的返回值绑定到成员选择运算符.*上,这显然是不正确的。 6.5 友元关系 一个对象的私有数据,只能通过成员函数进行访问,这是一堵不透明的墙。这种限制性给这样一种情况造成了困扰:类的某些成员原则上应该是私有的,但却需要在外部频繁的访问他们 友元(friend)机制 一个类的友元可以是一个外部函数,也可以是一个类。它们虽然不是该类的成员,但却能访问该类的任何成员。这显然提高了访问效率 友元分类 友元函数 友元类 6.5.1 友元函数 语法: class 类名 { //other members; friend 函数声明; }; 例如: int f(); class A { friend int f(); } 友元声明必须放在类定义中,但放在哪个段中无关紧要。 class Rectangle //简化版 { private: int width, height; //other members public: friend int perimeter(const Rectangle r); }; ? int perimeter(const Rectangle r) { return (r.width + r.height) * 2; } 在友元函数中直接访问类的私有成员 6.5.1 友元函数 一旦声明了类的友元,那么该类的作用域就对友元开放。也就是说,类的所有成员对友元都是可见的、可访问的 友元的作用范围仅限在直接声明它的类中。友元不能逾越嵌套类的界限而访问到外部类,除非友元同时也被显式声明为外部类的友元 例如: class C { friend int f(); }; class A { class B { friend int f(); } C objC; }; 函数f()仅仅是类B和类C的友元,而非类A的友元。 6.5.1 友元函数 全局友元函数不属于任何类,因此全局友元函数没有this 指针。 除了全局友元函数外,一个类的成员函数也可以成为其它类的友元。 class Rectangle; //forward declaration class Calculator { public: int perimeter(const Rectangle r); }; ? class Rectangle //简化版 { private: int width, height; //other members public: friend int Calculator::perimeter(const Rectangle r); }; ? int Calculator::perimeter(co

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档