【C++】6___友元

目录

一、基本概念

二、全局函数做友元

三、类做友元

四、成员函数做友元


一、基本概念

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

关键字:friend

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

二、全局函数做友元

代码示例

cpp 复制代码
#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();
}

三、类做友元

代码示例

cpp 复制代码
#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();
}

四、成员函数做友元

代码示例

cpp 复制代码
#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();

}
相关推荐
Allen Bright5 分钟前
【JVM-7】JVM 命令行工具 jstack 的使用和具体应用案例
java·开发语言·jvm
向宇it12 分钟前
【零基础入门unity游戏开发——unity3D篇】地形Terrain的使用介绍
开发语言·unity·c#·编辑器·游戏引擎
一个小坑货13 分钟前
CentOS 9 Stream 中查看 Python 版本并升级 Python
开发语言·python·centos
姚永强17 分钟前
登录系统网址作业
开发语言·前端·javascript
hqxnb66627 分钟前
构建高效的进程池:深入解析C++实现
开发语言·c++·算法
kucupung29 分钟前
【编译构建】用cmake编译libjpeg动态库并实现转灰度图片
linux·c++
数据小爬虫@42 分钟前
利用 Java 爬虫获取 1688 商品评论的实践指南
java·开发语言·爬虫
我命由我123451 小时前
11-1.Android 项目结构 - androidTest 包与 test 包(单元测试与仪器化测试)
android·开发语言·ide·java-ee·单元测试·kotlin·android studio
此刻我在家里喂猪呢1 小时前
Qt应用之MDI(多文档设计)
c++·qt
啵啵鱼爱吃小猫咪1 小时前
Franka例程学习——joint_point_to_point_motion
c++·人工智能·python·算法·ubuntu·机器人