【学习篇】【C++】【类和对象】【友元】

关键字为friend,友元的目的就是让一个函数 可以访问另一个类中的私有成员。
具体做法为在类中做一个声明,不用写在权限里都行。以下为友元的三种实现方式:

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

一、全局函数做友元

class Home
{
//函数goodfriend是home类的友元,可以访问私有成员
friend void goodfriend(Home* home);

public:
	string m_sittingroom; //客厅(公开的)
private:
	string m_bedroom; //卧室(私有的)
public:
	Home()
	{
		this->m_sittingroom = "客厅";
		this->m_bedroom = "卧室";	
	}
};

首先先建一个Home类,其中m_bedroom是私有属性。因此接下来,全局函数goodfriend如果要访问m_bedroom,则需要在Home类中做一个声明,不用写在权限里都行。(一般写在类的定义首行)

接下来全局函数goodfriend才能正常访问到m_bedroom,如下代码所示home->m_bedroom

void goodfriend(Home* home)
{
	cout << "好朋友 全局函数正在访问: " << home->m_sittingroom << endl;
	cout << "好朋友 全局函数正在访问: " << home->m_bedroom << endl;
}
void test01()
{
	Home m_home;
	goodfriend(&m_home);
}

二、类做友元

class Home
{
	//类goodfriend是Home类的友元,可以访问私有成员
	friend class goodfriend;
public:
	string m_SittingRoom; //客厅(公开的)
private:
	string m_BedRoom; //卧室(私有的)
public:
	Home();//类外写
};

接下来要使得goodfriend类成为Home类的友元,因此需要在Home类的首行加上friend class goodfriend;。接下来goodfriend类的visit函数可以访问Home中的私有属性。

class goodfriend
{
public:
	goodfriend();//类外写
public:
	void visit(); //参观函数,访问Home中的属性
	Home* m_home;
};

这里我们顺便学习一下在类外写成员函数。需要注意的是,要在函数名前面 加上成员函数的所属类,如下Home::Home()goodfriend::goodfriend()void goodfriend::visit()

//类外写成员函数
Home::Home()
{
	this->m_SittingRoom = "客厅";
	this->m_BedRoom = "卧室";	
}
goodfriend::goodfriend()
{
	//创建一个Home的对象
	m_home = new Home;
}
void goodfriend::visit()
{
	cout << "好朋友 类正在访问: " << m_home->m_SittingRoom << endl;
	cout << "好朋友 类正在访问: " << m_home->m_BedRoom << endl;
}

goodfriend类成为Home类的友元之后,函数visit中的m_home->m_BedRoom就可以正常访问了。

void test01()
{
	goodfriend gf1;
	gf1.visit();
}

三、成员函数做友元

这一次我们打算让函数visit可以访问Home中的私有成员,而函数visit2不行。

class Home;

【注意】此处要先声明Home类,然后定义goodfriend类,再定义Home类。否则如果先定义Home类,则进行友元声明时friend void goodfriend::visit();,无法识别goodfriend::visit,因为此时还没有定义goodfriend类,会报错。

class goodfriend
{
public:
	goodfriend();
public:
	void visit(); //使其可以访问Home中的私有成员
	void visit2(); //使其不可以访问Home中的私有成员
	Home* m_home;
};

下面我们在Home类中声明了goodfriend类中的函数visit是友元。

class Home
{
	friend void goodfriend::visit();
public:
	string m_SittingRoom; //客厅(公开的)
private:
	string m_BedRoom; //卧室(私有的)
public:
	Home();
};

类外写成员函数,此处为类的无参构造函数

Home::Home()
{
	this->m_SittingRoom = "客厅";
	this->m_BedRoom = "卧室";
}
goodfriend::goodfriend()
{
	//创建一个Home的对象
	m_home = new Home;
}

此时只有友元函数visit可以访问m_BedRoom,而非友元函数的visit2则不可以访问。

void goodfriend::visit()
{
	cout << "visit函数正在访问: " << m_home->m_SittingRoom << endl;
	cout << "visit函数正在访问: " << m_home->m_BedRoom << endl;
}
void goodfriend::visit2()
{
	cout << "visit2函数正在访问: " << m_home->m_SittingRoom << endl;
}

下面我们建一个goodfriend类的对象gf1

void test01()
{
	goodfriend gf1;
	gf1.visit();
	gf1.visit2();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值