深入类和对象MJLIU1.pptVIP

  • 1
  • 0
  • 约1.33万字
  • 约 51页
  • 2019-11-06 发布于广东
  • 举报
* * * * * * * * 隐含于每一个类的成员函数中的特殊指针。 明确地指出了成员函数当前所操作的数据所属的对象。 当通过一个对象调用成员函数时,系统先将该对象的地址赋给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)

1亿VIP精品文档

相关文档