一、友元函数
- 友元实际上并不是面向对象的特征,而是为了兼顾C语言程序设计的习惯与C++友元的概念破坏了类的封装性和信息隐藏,但有助于数据共享,能够提高程序执行的效率。信息隐藏的特点,而特意增加的功能。这是一种类成员的访问权限。
- 友元使用关键字friend标识。在类定义中,当friend出现在函数说明语句的前面时,表示该函数为类的友元函数。一个函数可以同时说明为多个类的友元函数,一个类中也可以有多个友元函数。当friend出现在类名之前时,表示该类为类的友元类。
- 友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。
- 友元函数不是类的成员函数,但允许访问类中的所有成员。在函数体中访问对象成员时,必须使用“对象名.对象成员名”的方式。
#include<iostream> using namespace std; class Student{ private: int id; string name; public: Student(int id,string name); //声明友元函数 friend void show(Student &stu); }; //友元函数的实现(直接可以访问类的私有属性) void show(Student &stu){ cout<< stu.id << " name:" <<stu.name <<endl; }; Student::Student(int id,string name):id(id),name(name){ } int main(){ Student stu(1,"张三"); show(stu); return 0; }
二、友元类
- 如果将一个类B说明为另一个类A的友元类,则类B中的所有函数都是类A的友元函数,在类B的所有成员函数中都可以访问类A中的所有成员。在类定义中
- 声明友元类的格式如下:friend class 类名;
- 友元类的关系是单向的。若说明类B是类A的友元类,不等于类A也是类B的友元类。友元类的关系不能传递,即若类B是类A的友元类,而类C是类B的友元类,不等于类C是类A的友元类。除非确有必要,一般不把整个类说明为友元类,而仅把类中的某些成员函数说明为友元函数。
#include<iostream> using namespace std; class Teacher; class Student{ private: int id; string name; public: Student(int id,string name); void show(Teacher *tea); }; Student::Student(int id,string name):id(id),name(name){ } class Teacher{ private: int id; string name; public: Teacher(int id,string name); //将Student类声明为Teacher类的友元类 friend class Student; }; Teacher::Teacher(int id,string name):id(id),name(name){ } void Student::show(Teacher *tea){ cout << this->id << this->name << tea->name << endl; } int main(){ Teacher tea(1,"老外"); Student stu(1,"张三"); stu.show(&tea); return 0; }