C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计
基本知识 a C++语言程序设计
友元是可以访问类的私有成员和保护成员的外部成员 9.4 友元 友元是可以访问类的私有成员和保护成员的外部成员 在一个类中,可以利用关键字friend将外部成员(一般函数、其他类的成员函数或其他类)声明为本类的友元 类中本来隐藏的信息(私有和保护成员)可以被友元访问 友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制 从封装的角度讲,友元是对数据隐藏的破坏 很多情况,考虑到数据共享的必要性,为了提高程序的效率,这种“小破坏”还是必要的 C++语言程序设计
9.4 友元 友元函数 友元类 C++语言程序设计 声明为友元的是一般函数或是另一个类的成员函数 是在类声明中由关键字friend修饰的非成员函数 一般函数 另一个类的成员函数 它不是本类的成员函数,但是在它的函数体中可以通过对象名访问本类的私有和保护成员 友元类 在类的声明中可以声明另一个类为本类的友元,这时称为友元类 是在类的声明中由关键字friend修饰的其他类 若A类是B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员 C++语言程序设计
9.4 友元 例:使用友元函数计算两点距离 C++语言程序设计 //使用友元函数计算两点距离 #include <iostream> #include <cmath> using namespace std; class Point //Point类定义 { public: //外部接口 Point(int xx=0, int yy=0) {X=xx;Y=yy;} int GetX() {return X;} int GetY() {return Y;} friend float fDist(Point &a, Point &b); //友元函数声明 private: //私有数据成员 int X,Y; }; C++语言程序设计
9.4 友元 C++语言程序设计 float fDist(Point &p1, Point &p2) //友元函数实现 { //double x=double(p1.GetX( )-p2.GetX( )); double x=double(p1.X-p2.X); //通过对象访问私有数据成员 //double x=double(p1.GetY( )-p2.GetY( )); double y=double(p1.Y-p2.Y); return float(sqrt(x*x+y*y)); } void main() //主函数 { Point myp1(1,1),myp2(4,5); //定义Point类的对象 cout<<"The distance is:"; cout<<fDist(myp1,myp2)<<endl; //计算两点间的距离 C++语言程序设计
例:教师可以修改学生的成绩,将教师类的成员函数assignGrade( )声明为学生类的友元函数 9.4 友元 例:教师可以修改学生的成绩,将教师类的成员函数assignGrade( )声明为学生类的友元函数 class Student //前向引用声明 class Teacher { public: //… void assignGrades(Student& s) { s.grade=4.0; } private: //…. }; class Student { public: //… //友元函数声明 friend void Teacher::assignGrades(Student& s) ; private: float grade; }; C++语言程序设计
9.4 友元 例:友元类的使用 C++语言程序设计 //友元类的使用 #include <iostream> #include<cstring> using namespace std; class Student; //前向引用声明,只声明类名,类定义在后面 class Teacher { public: Teacher(int i, char* c); void show(); void assignGrades(Student& s);//使用未定义的类,需要前向引用声明 private: char* name; int id; }; C++语言程序设计
9.4 友元 C++语言程序设计 Teacher::Teacher(int i, char* c) { id = i; name = new char[strlen(c)+1]; if (name != 0) strcpy(name, c); } void Teacher::show() cout<<"工作证号:"<<id<<" 姓名:"<<name<<endl; void Teacher::assignGrades(Student& s) if (s.pT->id == id) s.grade=4.0; //修改学生成绩,直接操作另一个类私有的成员 C++语言程序设计
9.4 友元 C++语言程序设计 class Student { public: Student(int i, char* c, float s, Teacher* t); void printstu(); friend class Teacher; //友元类的声明 private: Teacher* pT; int sid; char* name; float grade; }; C++语言程序设计
9.4 友元 C++语言程序设计 Student::Student(int i, char* c, float s, Teacher* t) { sid = i; name = new char[strlen(c)+1]; if (name != 0) strcpy(name, c); grade = s; pT=t; } void Student::printstu() cout<<"学号:"<<sid<<" 姓名:"<<name; cout<<" 成绩:"<<grade<<endl; C++语言程序设计
9.4 友元 C++语言程序设计 void main() { Teacher wang(62, "wang yi"); wang.show(); Student s1(10, "zhang san", 87.6, &wang); s1.printstu(); wang.assignGrades(s1); s1.printstu (); Student s2(12, "li si", 80, &wang); s2.printstu(); wang.assignGrades(s2); s2.printstu (); } C++语言程序设计
9.4 友元 关于友元类的说明 友元关系是不能传递的 友元关系是单向的 C++语言程序设计 B类是A类的友元,C类是B类的友元,C类和A类之间,如果没有声明,就没有任何友元关系,不能进行数据共享。 友元关系是单向的 如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据 C++语言程序设计