C++友元

1.友元函数

上图的number1和number2被private给保护了起来,以至于print不能访问。 

有没有什么办法能让print(const Date& d1)能够访问number1和number2   ?

让print()在类中声明,并且在前面加上关键字 friend 加上关键就说明这个函数是这个类的友元函数。

 运行结果

通过这样的方式便能访问类private的成员变量 

 友元函数并不属于类,只是一种声明权限,它可以访问类的private的成员。

#include<iostream>
using namespace std;
class Date{
	friend void print(const Date& d1);
public:
private:
	static int number1;
	static int number2;
};
int Date::number1 = 10;
int Date::number2 = 20;
void print(const Date& d1){
	cout << d1.number1 << " " << d1.number2 << endl;
}
int main(){
	Date D1;
	cout << sizeof(D1) << endl;
	return 0;
}

 

 一个函数可以是多个类的友元函数

#include<iostream>
using namespace std;
class BB;
class AA{
	friend void print(const AA& d1, const BB& d2);
public:
private:
	int number1 = 10;
	int number2 = 20;
};
class BB {
	friend void print(const AA& d1, const BB& d2);
public:
private:
	int number1 = 30;
	int number2 = 40;
};
void print(const AA& A,const BB& B){
	cout <<A.number1<< endl;
	cout <<B.number1<< endl;
}
int main(){
	AA A;
	BB B;
	print(A, B);
	return 0;
}

看上面的代码,void print()是一个函数,它在两个类里面都有友元声明,所以它能用两个类里面的private的成员变量。

运行结果

 2.友元类

假如有两个类一个是AA,一个是BB,如果在BB中声明AA是它的友元类,那么AA就可以调用它的private的成员

#include<iostream>
using namespace std;
class BB {
	friend class AA;
public:
private:
	int bb1 = 30;
	int bb2 = 40;
};
class AA{
public:
	void print(const AA& A, const BB& B) {
		cout << A.aa1 << endl;
		cout << B.bb1 << endl;
	}
private:
	int aa1 = 10;
	int aa2 = 20;
};
int main(){
	BB B;
	AA A;
	A.print(A, B);
	return 0;
}

看上述代码,AA是BB的友元类,所以AA可以调用BB的成员。 

注意:我们需要在AA之前声明BB是一个类,这就是前置声明

友元类具有单向性,AA可以是BB的友元函数,但BB不能同时是AA的友元函数

友元关系不能传递,比如AA是BB的友元类,BB是CC的友元类,但AA不是CC的友元类 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值