C++基础之友元

一、友元函数

  • 友元实际上并不是面向对象的特征,而是为了兼顾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;
}
原文地址:https://www.cnblogs.com/jalja365/p/13031412.html