友元

友元全局函数

对于类内部的私有成员如果外部的函数想要直接访问类的私有成员是不合法的,而友元函数却能合法访问。 

 友元类

同样的对于一个类如果想要访问其他类的私有成员,那么可以在类中声明友元。

友元成员函数

使某个类的成员函数成为另一个类的友元成员函数使其能够访问这个类的私有成员。

注意,友元函数的声明和定义具有依赖关系,在此例中Monitor的 checkName 函数欲访问类 Student 类中的私有成员,那么 Monitor 类就必须先于 Student 类定义;同时 Monitor 类中有类 Student 的成员变量s,所以应该在

Monitor 前声明 Student 类,后面再定义 Student

#include <iostream>
#include <string>

using namespace std;

class Student;

class Monitor {
private:
    Student* s;

public:
    Monitor();
    void checkName();
};

class Student {
private:
    string name;
    int age;
    friend class Teacher; // 声明Teacher是该类的友元类
    
public:
    Student(string name, int age) {
        this->age = age;
        this->name = name;
    }

    friend void getName(Student* s);  //友元全局函数
    friend void Monitor::checkName();
};


class Teacher {
public:
    void checkStudentName(Student* s) {
        cout << "Student's name is " << s->name << endl;
    }
};


void getName(Student* s) {
    cout << "My friend's name is " << s->name << endl;
}

Monitor::Monitor() {
    s = new Student("vii", 1);
}

void Monitor::checkName() {
    cout << "Monitor is checking, and student's name is " << s->name;
}

int main() {
    Student s("eta", 0);

    getName(&s); // 外部友元全局函数访问类中私有成员变量

    Teacher t;
    t.checkStudentName(&s); // 友元类访问类中私有成员变量

    Monitor m;
    m.checkName();    // 有缘成员函数访问私有成员变量

    return 0;
}

 

posted @ 2023-02-24 19:20  Meetalone  阅读(31)  评论(0)    收藏  举报