C++类间的friend友元使用

C++初学者,写出来当作学习笔记。当然如果可以帮助到正在看这篇文章的你就更好了~

一,友元函数的使用

话不多说,直接上代码

#include<iostream>
using namespace std;
class A;//这里的类A必须先声明一下,否则后面在B类的print_a函数中会报错。ps:虽然这样写VS也会提示使用未曾定义的类A,但是可以正常通过编译。
class B
{
public:
	int b;
	void print_a(const A x);//此处不可对函数体进行定义!              <---这里还有注释↓
};
class A
{
public:
	int a;
	friend void B::print_a(const A x);//在此处声明为类A的友元函数,致此,此函数才有访问类A内成员的权限
	A(int x)
	{
		this->a = x;
	}
};
void B::print_a(const A x)
{
		cout << "This is in a " << x.a << endl;
}

int main()
{
	A x(3);
	B y;
	y.print_a(x);
	return 0;
}

值得注意的是,此时的友元函数可以访问A中的私有成员。从某种层面讲破坏了数据的封装性。

注释:对于函数中使用的形参x,以上程序中的定义为(const A x),当然直接写为(A x),(A &x),或者(const A &x)都是可以的。那么他们有什么区别呢?若在函数中不需要改变x的值可以使用const,由于在作为形参时,会复制一个x,调用构造函数,和析构函数。使用引用则不会产生这种现象。这种情况下,x也是可被改变的。若不想改变,可以使用最后一种(const A &x)。

二,类间的友元

上代码:

#include<iostream>
using namespace std;
class A
{
public:
	int a;
	friend class B;//声明B为友元类
	A(int x = 3) :a(x) {}//嫌麻烦,直接写个有参数的构造函数.......
};
class B
{
public:
	int b_data;
	void stillPrint_a(const A x)//注释同上
	{
		cout << "This type A:" << x.a << endl;
	}
};
int main()
{
	A a;
	B b;
	b.stillPrint_a(a);
	return 0;
}

三,普通函数的友元

还是整个代码:

#include<iostream>
using namespace std;
class A
{
public:
	int a_data;
	A(int x=3):a_data(x){}
	friend void print_A(const A& a);//将普通函数在类中声明
};
void print_A(const A& a)
{
	cout << "This A :" << a.a_data << endl;
}
int main()
{
	A a;
	print_A(a);
	return 0;
}

以上是关于friend的基本总结,如有错误,还望各位不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值