当前位置: 首页 > article >正文

【C++】6___友元

目录

一、基本概念

二、全局函数做友元

三、类做友元

四、成员函数做友元


一、基本概念

目的:让一个函数或者类,访问另一个类中的私有成员

关键字:friend

  • 友元的三种实现
  1. 全局函数做友元
  2. 类做友元
  3. 成员函数做友元

二、全局函数做友元

代码示例

#include<iostream>
using namespace std;

class Building{
	
 // 告诉编译器,goodgay全局变量是类Building 的好朋友,可以访问私有内容
	friend void goodgay(Building * building);
	
public:
	
	Building(){
		keting = "客厅";
		badroom = "卧室";
	}
public:
	string keting;
	
private:
	string badroom;
	
};

void goodgay(Building * building){
	cout<<"您的好友正在访问您的"<< "  " <<building->keting<<endl;
	cout<<"您的好友正在访问您的"<< "  " <<building->badroom<<endl;
}

void test(){
	Building b;
	goodgay(&b);
}

int main(){
	test();
}

三、类做友元

代码示例 

#include<iostream>
using namespace std;

class Building;
class goodgay{
	
public:
	goodgay();
	void vis();	 // 参观函数,访问Building中的属性
	
private:
	Building * building;
};

class Building{

//告诉编译器,类goodgay是类Building 的好朋友,可以访问私有内容
	friend class goodgay; 
public:
	Building();
public:
	string keting;
private:
	string badroom;
};

Building::Building(){ // 类外写成员函数
	this->keting = "客厅";
	this->badroom = "卧室";
}

goodgay::goodgay(){ // 类外写成员函数
	building = new Building; //创建建筑物对象
}

void goodgay::vis(){
	cout<<"您的好友正在访问您的"<<building->keting <<endl;
	cout<<"您的好友正在访问您的"<<building->badroom <<endl;
}

void test(){
	goodgay gg;
	gg.vis();
	
}
int main(){
	test();
}

四、成员函数做友元

代码示例 

#include<iostream>
using namespace std;

class Building;

class goodgay{
public:
	goodgay();
	void vis();
	void vis2();
private:
	Building * building;
};

class Building{
	
	//告诉编译器,类goodgay中的成员变量vis是类Building 的好朋友,可以访问私有内容
	friend void goodgay::vis(); 
	
public:
	Building();
public:
	string keting;
private:
	string badroom;
};

//       类外实现成员函数
Building::Building(){
	this->keting = "客厅";
	this->badroom = "卧室";
}

goodgay::goodgay(){
	building = new Building;
}
void goodgay::vis(){
	cout<<"您的好友vis正在访问您的"<<building->keting<<endl;
	cout<<"您的好友vis正在访问您的"<<building->badroom<<endl;
}

void goodgay::vis2(){
	cout<<"您的好友vis2正在访问您的"<<building->keting<<endl;
//	cout<<"您的好友vis正在访问您的"<<building->badroom<<endl;
}

void test(){
	goodgay gg;
	gg.vis();
	gg.vis2();
}
int main(){
	test();

}

http://www.kler.cn/a/430001.html

相关文章:

  • ios越狱脚本巨魔商店安装教程
  • vue 导出excel接口请求和axios返回值blob类型处理
  • Linux之线程池与单例模式
  • 数据结构(Java版)第七期:LinkedList与链表(二)
  • docker 基本使用
  • 计算机网络 (23)IP层转发分组的过程
  • K8S OOM killer机制
  • centos 7.9 安装jdk1.8 mysql redis等
  • redis 过期与清理
  • 深入浅出云计算 ---笔记
  • 香港科技大学广州|智能交通学域博士招生宣讲会—东南大学专场
  • C# RSA加密和解密,RSA生成私钥和公钥
  • 知识图谱9:知识图谱的展示
  • Docker 安装和使用
  • 【算法】图论——单源最短路问题
  • node(multer)上传文件
  • 4K高清壁纸网站推荐
  • 【TCP 网络通信(发送端 + 接收端)实例 —— Python】
  • 《操作系统》(408非PV操作大题)
  • 【生信刺客】11分的WGCNA+网络药理学+分子对接+体内外实验
  • 数据结构初阶---栈和队列
  • 如何选择安全、可验证的技术?
  • Ubuntu系统上mysql服务部署
  • C#实现一个HttpClient集成通义千问-流式输出内容提取
  • 鸿蒙特色实战2
  • 商业银行基于容器云的分布式数据库架构设计与创新实践