C++ 基础【09】

本文代码仓库地址: gitee码云CSDN笔记仓库地址



全局函数做友元【Class11】

// 友元 -- 全局函数做友元
#include <iostream>

using namespace std;


class person01_xy {
	// 加上这句话我就把 全局函数fun01 当成朋友了,既然是朋友那他可以访问我私有的成员
	friend void fun01();

public:
	void mFun01() {
		cout << "可以和我说话哦~" << endl;
	}

private:
	void mFun02() {
		cout << "这是我的心里面话,只会对我的朋友说哦~" << endl;
	}

};


// 我是 person01_xy 的朋友
void fun01() {
	person01_xy p1;
	p1.mFun01();
	// 我们是好朋友,我知道你的心里话哦
	p1.mFun02();
}

// 我对 person01_xy 来说只是一个路人
void fun02() {
	person01_xy p1;
	p1.mFun01();
	// 因为 fun02 和 person01_xy 是陌生人关系,所以 person01_xy 不会和 fun02 说心里话
	// p1.mFun02();
}


int main() {
	fun01();
	cout << "------------------分界线------------------" << endl;
	fun02();


	cout << endl;
	system("pause");
	return 0;
}

类做友元【Class12】

// 友元 -- 类做友元
#include <iostream>

using namespace std;


class goodGay_xy;
class person01_xy {
	// 加上这句我就承认 goodGay_xy类 是我的好基友了
	friend class goodGay_xy;

public:
	person01_xy();

public:
	string str1;

private:
	string str2;

};

// 我并没有承认 person01_xy 是我的好朋友
class goodGay_xy {
public:
	// 声明我的好基友 person01_xy
	goodGay_xy();
	// 释放我的好基友 person01_xy
	~goodGay_xy();

public:
	void mFun01() {
		cout << "我们之间可以进行交流的程度为:" << person01->str1 << endl;
	}

	void mfun02() {
		// person01_xy 已经承认我是他的好基友了,我当然可以访问他的私有成员了
		cout << "我们之间可以进行交流的程度为:" << person01->str2 << endl;
	}

private:
	person01_xy* person01;

};

// 我只是一个普通的陌生人
class person02_xy {
public:
	// 声明普通的陌生人 person01_xy
	person02_xy() {
		person02 = new person01_xy;
	}

	// 释放普通的陌生人 person01_xy
	~person02_xy() {
		delete person02;
	}

public:
	void mFun01() {
		cout << "我们之间可以进行交流的程度为:" << person02->str1 << endl;
	}

	void mfun02() {
		// person01_xy 没有说我是他的朋友,所以我不能访问他私有的成员
		// cout << "我们之间可以进行交流的程度为:" << person02->str2 << endl;
		cout << "person01_xy 还没有承认我是他的朋友,不愿意跟我说心里话" << endl;
	}
	
private:
	person01_xy* person02;

};

// 类外写成员函数【需要标明是那个作用域下面的成员函数】
person01_xy::person01_xy() {
	str1 = "普通的沟通";
	// 这是自己人,可访问私有的
	str2 = "可以说心里话";
}

goodGay_xy::goodGay_xy() {
	// 这是自己人,可访问私有的
	person01 = new person01_xy;
}

goodGay_xy::~goodGay_xy() {
	delete person01;
}


void fun01() {
	cout << "goodGay_xy g1 所能访问的" << endl;
	goodGay_xy g1;
	g1.mFun01();
	g1.mfun02();
	cout << endl;
	cout << "person02_xy p1 所能访问的" << endl;
	person02_xy p1;
	p1.mFun01();
	p1.mfun02();
}


int main() {
	fun01();
	cout << "------------------分界线------------------" << endl;
	


	cout << endl;
	system("pause");
	return 0;
}

成员函数做友元【Class13】

// 友元 -- 成员函数做友元
#include <iostream>

using namespace std;


class person02_xy;
/*
* 不要把 person01_xy 放在 person02_xy 的后面【顺序颠倒了,编译器语法提示不报错,但是开始编译就会报错】
* 我的理解就是,如果颠倒了,前面的声明 class person02_xy;就只是声明了这个类型,并不能找到里面的成员函数,
* 至于在头文件中声明在别的源文件中写实现,会不会出现上面这样的错误还没有测试过
*/
class person01_xy {
public:
	person01_xy();
	void mFun01();
	void mFun02();
	~person01_xy();

private:
	person02_xy* person;

};

class person02_xy {
	/*
	* 加上这句话,我就承认成员函数 mFun01 是我的好基友,可以访问我私有的成员
	* person01_xy与person02_xy互换后,下面这句话在编译的时候就会报错
	*/
	friend void person01_xy::mFun01();

public:
	person02_xy();
	string str1;

private:
	string str2;
};

person02_xy::person02_xy() {
	str1 = "普通交流";
	str2 = "可以说心里话";
}

person01_xy::person01_xy() {
	person = new person02_xy;
}

void person01_xy::mFun01() {
	cout << "我是mFun01,person02_xy承认我是他的好基友,我们可以交流的程度为:" << person->str1 << endl;
	// person02_xy 承认 mFun01 是他的好朋友,所以好朋友可以访问他的私有成员
	cout << "我是mFun01,person02_xy承认我是他的好基友,我们可以交流的程度为:" << person->str2 << endl;
}

void person01_xy::mFun02() {
	cout << "我是mFun02,person02_xy不承认我是他的好基友,我们可以交流的程度为:" << person->str1 << endl;
	// cout << "我是mFun02,person02_xy不承认我是他的好基友" << person01->str2 << endl;
	cout << "我是mFun02,person02_xy不承认我是他的好基友,不会让我访问他的私有成员:" << endl;
}

person01_xy::~person01_xy() {
	delete person;
}


void fun01() {
	person01_xy p1;
	p1.mFun01();
	cout << endl;
	p1.mFun02();
}


int main() {

	fun01();

	cout << endl;
	system("pause");
	return 0;
}

一点点笔记,以便以后翻阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小印丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值