首页 > 系统相关 >Linux C++ 016-友元

Linux C++ 016-友元

时间:2024-04-03 09:59:16浏览次数:22  
标签:友元 Building SittingRoom visit C++ 016 BedRoom GoodGay

Linux C++ 016-友元

本节关键字:Linux、C++、友元及三种实现方式
相关库函数:

友元的概念及关键字 friend

在程序里,有些私有属性也可以让类外特殊的函数或者类进行访问,这就需要用到友元技术。
友元的目的就是让一个函数或者类访问另一个类中私有成员。

友元的三中实现方式

(1) 全局函数做友元
(2) 类做友元
(3) 成员函数做友元

全局函数做友元

// 建筑物类
class Building
{
	// 在类内声明goodGay是Building类的友元,可以访问私有成员
	friend void goodGay(Buiilding *building);
public:
	Building()
	{
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}
public:
	string m_SittingRoom;
private:
	string m_BedRoom;
}
void goodGay(Buiilding *building)
{
	cout << "好基友的全局函数正在访问:" << building->m_SittingRoom << endl;
	cout << "好基友的全局函数正在访问:" << building->m_BedRoom << endl;
}
void test01()
{
	Building building;
	goodGay(&building);
}

类做友元

class Building
{
    friend class GoodGay; //GoodGay类是Building类的友元
public:
    Buiilding();
public:
    string m_SittingRoom;
private:
    string m_BedRoom;
}

class GoodGay
{
public:
    GoodGay();
    void visit(); //参观函数访问Building中的私有属性
    Buiilding *building;
}
// 类外写成员函数
Building::Building
{
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
    // 创建建筑对象
    building = new Building;
}
void GoodGay::visit()
{
    cout << "好基友类正在访问:" << building->m_SittingRoom << endl;
    cout << "好基友类正在访问:" << building->m_BedRoom << endl;
}
void test01()
{
    GoodGay gg;
    gg.visit();
}

成员函数做友元

class Building
{
	friend void GoodGay::f_visit(); // 声明是友元的成员函数
public:
	Building();
public:
	string m_SittingRoom;
private:
	string m_BedRoom;
}
class GoodGay
{
public:
	GoodGay();
	void visit();
	void f_visit(); // 可以访问Building的私有成员
	
	Building *building;
}
// 类外写成员函数
Building::Building()
{
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
	building = new Building;
}
void GoodGay::visit()
{
	cout << "visit 函数正在访问:" << building->m_SittingRoom << endl;
	//cout << "visit 函数正在访问:" << building->m_BedRoom << endl;
}
void GoodGay::f_visit()
{
	cout << "visit 函数正在访问:" << building->m_SittingRoom << endl;
	cout << "visit 函数正在访问:" << building->m_BedRoom << endl;
}

void test2()
{
	GoodGay gg;
	gg.visit();
	gg.f_visit();
}

标签:友元,Building,SittingRoom,visit,C++,016,BedRoom,GoodGay
From: https://blog.csdn.net/qq_45157350/article/details/135868405

相关文章

  • Linux C++ 015-对象模型和this指针
    LinuxC++015-对象模型和this指针本节关键字:Linux、C++、对象模型、this指针相关库函数:成员变量和成员函数分开存储1、在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上;2、C++编译器会给每个空对象也分配一个字节的空间,是为了区分空对象占......
  • C++提高学习笔记
    C++提高学习笔记面向对象设计的基本概念面向对象的分析(OOA):解析出需求,需要做什么面向对象的设计(OOD):需要设计哪些类,类中有哪些数据成员,哪些成员函数,类与类之间的关系面向对象的变成(OOP):将需求与设计转换为代码UML语言:同一建模语言类与类之间的关系......
  • C++ 条件与 If 语句:掌握逻辑判断与流程控制精髓
    C++条件和If语句您已经知道C++支持数学中的常见逻辑条件:小于:a<b小于或等于:a<=b大于:a>b大于或等于:a>=b等于:a==b不等于:a!=b您可以使用这些条件来针对不同的决定执行不同的操作。C++具有以下条件语句:使用if来指定一个代码块,如果指定的条件为true,则......
  • 《解释器模式(极简c++)》
            本文章属于专栏-概述-《设计模式(极简c++版)》-CSDN博客模式说明方案:对每个data建立一个单点解释器对象X,dataA和dataB之间的关系,建立一个关系解释器对象Y,这里的Y处理的是X1和X2。这样,复用了解释单文本的逻辑,和多文本间关系的逻辑。优点:灵活性:易于改变......
  • 高精度算法(加、减、乘、除,使用c++实现)
    一、概念在我们进行计算的过程中,经常会遇到几十位,甚至几百位的数字的计算问题,也有可能会遇到小数点后几十位,几百位的情况,而我们面对这样的情况下,  和  的数据范围显然是不够使用的了。因此这时,我们就需要引入一个新的算法,叫做高精度算法。高精度算法:它是处理大数字的数......
  • C++bitset类型
    bitset类型我们介绍了将整型运算对象当作二进制位集合处理的一些内置运算符。标准库还定义了bitset类,使得位运算的使用更为容易,并且能够处理超过最长整型类型大小的位集合。bitset类定义在头文件bitset中。定义和初始化bitsetbitset类是一个类模板,它类似array类,具有固定的......
  • C++tuple类型
     tuple类型tuple是类似pair的模板。每个pair的成员类型都不相同,但每个pair都恰好有两个成员。不同tuple类型的成员类型也不相同,但一个tuple可以有任意数量的成员。每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可以与另一个tuple类型不同。当我们希望......
  • c++游戏 狼人杀(升级)
    代码:#include<iostream>//C++输入输出流库#include<cstdlib>//使用srand函数要用到这个库#include<ctime>//使用time函数要用到这个库#include<Windows.h>#include<conio.h>longlongsr=0;usingnamespacestd;voidbrc(){ system("cls"); lon......
  • 使用c++装饰器模式完成 QQ秀这个游戏,给动画人物搭配不同服饰。
    //比如穿T恤,衬衫,外套,皮鞋,运动鞋,靴子...,根据下面的类图完//被装饰的类classPerson{public:   stringm_name;   Person(){};//子类实例化需要无参构造   Person(stringname):m_name(name){}   virtualvoidshow(){cout<<m_name;};};//......
  • 使用c++观察者模式完成主题订阅 消息通知
    //造主题,主题是默认的新闻主页,主题下面还有具体的频道:经济、体育、娱乐。这样主题也分为两个层,观察者可以订阅新闻主页,也可以订阅具体的频道。//观察者模式//抽象类观察者classAbsObserver{public:   virtualvoidupdate(stringcontent)=0;//更新的接口};......