#C++ Day26 November 8 2025

 Day26 November 10 2025

//Object – Oriented 6 – 1 Global Function as a friend element

//全局函数作为友元

#include <iostream>

#include <string>

using namespace std;

//友元就是一个函数或一个类能够访问另外一个类的私有成员

/*

友元的目的

让一个类或函数

能够访问另一个类的私有成员

友元的关键字:friend

三种友元:

1.全局函数作为友元

2.类作为友元

3.成员函数作为友元

*/

class People {

friend void friendVisit(People* p);//把函数拷到这里去 并且加上一个friend

//友元 让一个函数能够访问另一个类的私有成员

public:

People(){

m_House = “房子”;

m_Car = “跑车”;

}

public://公有 房子

string m_House;

private://私有 车子

string m_Car;

};

void friendVisit(People *p) {//好朋友   传一个People指针

cout << “好朋友来访问你的” << p->m_House << endl;

cout << “好朋友来访问你的” << p->m_Car << endl;//直接就会报错

}

int main() {

People p;//实例化一个真正的人出来

friendVisit(&p);//把对象指针传进来

return 0;

}

//Object – Oriented 6 – 2 Class as a friend element

//类作为友元

#include <iostream>

#include <string>

using namespace std;

//让一个类去访问另一个类的私有成员

class People;//先声明下 让PeopleFriend 类能访问到

class PeopleFriend {

public:

PeopleFriend() {//先把构造函数写出来

}

/*

void visit(People *p){//传进来一个People指针    把这个函数的定义变成函数声明

////程序是从上往下执行的 所以可能有未定义的问题 看不到车和房子

//cout << “好朋友来访问你的” << p->m_House << endl;//People类的定义在PeopleFriend的下面  在实现这个函数的时候 东西还没定义出来

//cout << “好朋友来访问你的” << p->m_Car << endl;//私有成员一般访问不了

}

*/

void visit(People* p);

};

class People {

friend class PeopleFriend;//把类作为友元让它的private元素能被朋友类访问 

public:

People() {//默认构造函数

m_House = “房子”;

m_Car = “跑车”;

}

public:

string m_House;

private:

string m_Car;

};

void PeopleFriend::visit(People* p) {//把函数拷贝到这里  加上作用域    改成在这里定义函数

cout << “好朋友来访问你的” << p->m_House << endl;

cout << “好朋友来访问你的” << p->m_Car << endl;

}

int main() {

People p;

PeopleFriend pf;

pf.visit(&p);

return 0;

}

//Object – Oriented 6 – 3 Member function as a friend

//成员函数作为友元

#include <iostream>

#include <string>

using namespace std;

//成员函数作为友元

//PeopleFriend的某个函数能够访问People的私有成员变量

class People;//先把它声明出来 

class PeopleFriend {

public:

PeopleFriend() {} //只要声明 不要在这里定义了

void VisitAll(People* p);

void VisitPub(People* p);

};

class People {

//friend class PeopleFriend; //把这个类作为友元 但是这里不能这么写 不然就两个都能访问了

friend void PeopleFriend::VisitAll(People* p);//函数作为友元就保证了只有某些函数可以访问相应的成员变量

//希望只有某些函数能够访问另外一个类的私有成员变量 希望能够访问的那些函数  我给它变成它的友元就好了

public:

People() {

m_House = “别墅”;

m_Car = “跑车”;

}

public:

string m_House;

private:

string m_Car;

};

void PeopleFriend::VisitAll(People* p) {//加上作用域 这个要能访问两个 私有和公共

cout << “好朋友访问了你的” << p->m_House << endl;//好朋友访问了你的公共属性

cout << “好朋友访问了你的” << p->m_Car << endl;//类不是它的友元的话 访问不到它的私有成员变量的

//既要访问你的别墅 又要访问你的跑车

};

void PeopleFriend::VisitPub(People* p) {//访问公共属性 这个只能访问公共的

cout << “好朋友访问了你的” << p->m_House << endl;//好朋友访问了你的公共属性

//cout << “好朋友访问了你的” << p->m_Car << endl;

};

int main() {

People p;

PeopleFriend pf;

pf.VisitAll(&p);

pf.VisitPub(&p);

return 0;

}