1、友员,第七章,2,回顾,文件输入 文件输出 异常处理,3,目标,友元函数 友元类 操作符重载,4,友元函数 4-1,非成员函数不能访问私有成员友员函数允许访问类的私有部分而不是成员,5,友元函数 4-2,6,友元函数 4-3,class teacher private:int a; public:teacher()a = 5;friend int stud(teacher); ; int stud(teacher t1) return (t1.a); /因为stud()是一个友元 ,没有friend,7,友元函数 4-4,class Teacher; /前向声明 class Student p
2、rivate:int st_data; public:void getstuddata();friend void display(Student abc, Teacher xyz); ; class Teacher private:int th_data; public:void getteachdata();friend void display(Student abc, Teacher xyz); ; void display(Student abc, Teacher xyz) /某些代码 ,我是大家的朋友,类只有在声明之后才能被引用,8,友元函数的特性,拥有访问类的私有部分的权限 没有
3、 this 指针 可以置于类说明的私有或公有部分 定义友元函数时,不需要使用类名和作用域解析操作符作为前缀,9,优点,在接口设计的选择方面提供了自由度 成员函数和友元函数具有同等的特权 主要的区别: 友元函数的调用方式类似于 func(xobject) ,而成员函数的调用方式类似于 object.func( ) 设计者可以选择最有可读性的语法,10,缺点,提高了编程的灵活性,但是违背了面向对象编程的原则 在编码中对完整性的破坏可以在一定程度上加以控制 必须在它要访问的类中进行声明。没有源代码是无法完成的,11,友元类 3-1,当一个类的全部或者多数成员函数都必须访问访问另一个类时 声明整个类为
4、另一个类的友元,12,友元类 3-2,#include class beta; /前向声明 class alpha private:int a_data; public:alpha() a_data = 10; void display(beta); ; class beta private:int b_data; public:beta() b_data = 20; friend void alpha:display(beta bb); ;,类只有在声明之后才能被引用,成员函数是友员,13,友元类 3-3,#include class beta; /前向声明 class alpha priv
5、ate:int data; public:friend class beta; /beta是一个友元类 ; class beta public:void display(alpha d) /可以访问alphacout d.data;void get_data(alpha d) /可以访问alphaint x = d.data; ;,类只有在声明之后才能被引用,14,操作符重载 2-1,将现有的操作符与一个成员函数相关联并与其类的对象一起使用使下面的操作成为可能if (obj1 obj2)/. 其中,obj1和obj2是一个类的对象,15,操作符重载 2-2,编译器通过检查操作数的类型来选择重载
6、操作符是多态性的一种形式 运算多态性,16,注意要点,重载不能改变操作符的基本功能 也不能改变其优先级顺序置 +(自增)和 -(自减)只能被用作一元操作符 可以使用重载的 + 操作符来对两个对象相乘,但是这将使得代码难以理解,17,不能被重载的操作符,sizeof( ) 操作符 圆点操作符 (.) 作用域解析操作符 (:) 条件操作符 (? :) 指向成员的指针操作符 (.*),18,优点,使得程序更容易理解和调试obj3 = obj1 + obj2;而不是obj3.addobjects(obj1,obj2);,19,操作符函数,重载操作符的实际指令 operator关键字return_typ
7、e operator op(argument list);,被重载的操作符,20,一元操作符的重载,class temp private :int x, y; public :void operator +(void); ; void temp:operator +(void) x+;y+; ,21,二元操作符的重载,两种方式 作为成员函数 接受单参数,该参数是这个操作符右边的值作为友员函数 接收双参数,22,为字符串类重载+操作符,String operator +(String s2) /操作符函数 String temp; /创建一个临时对象strcpy(temp.s, s); /复制这个字符串strcat(temp.s, s2.s); /追加参数字符串return(temp); /返回临时对象 String s1 = “Welcome“; String s2 = “to C+“; String s3; s3 = s1 + s2;,23,总结,友元函数 友元类 操作符重载,