友元函数和友元类

友元函数可能会破环原类的私有属性:

声明有缘函数关键字;friend

在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。

实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。

友元函数的实例:

class FriendFunc{
public:
	friend void modifyval(FriendFunc *p, int _a);
	FriendFunc(int a)
	{
		this->a = a;
	}
	void print()
	{
		cout << "   a=" << a;
	}
	
private:
	int a;
};

void modifyval(FriendFunc *p, int _a)
{
	p->a = _a;
}
int main(int argc, char *argv[])
{
	FriendFunc opp3(1);
	opp3.print();
	modifyval(&opp3, 100);
	opp3.print();
	system("pause");
	return 0;
}

友元类:


友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。

使用友元类时注意:

(1) 友元关系不能被继承。

(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。

(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

总结起来:

(1)友元关系不可以继承,但对已有的方法来说访问权限不改变。

(2)如果改写基类的方法则访问权限改变

(3)友元关系不具有传递性

若类B是类A的友元,类C是B的友元,类C不一定是类A的友元。






友元类的简单举例:

#include <iostream>
using namespace std;
class FriA{

	friend class FriB;//声明友元类
public :
	void print()
	{
		cout << "  va=:" << va;
	}
private :
	int va;
};


class FriB{
public:
	void SetA(int _va)
	{
		objA.va = _va;
	}
	void disp(void)
	{
		objA.print();
	}

private:
	FriA objA;//此时类FriA是类FriB的子属性
};
int main()
{
	 FriB opp1;
	opp1.SetA(200);
	opp1.disp();
	system("pause");
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值