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;
}