【C++】友元函数

  • Post author:
  • Post category:其他




友元函数


类具有封装性和隐蔽性,只有类的成员函数才能访问类的私有成员,友元函数可以访问其他类中的私有成员,有助于数据共享,提高程序效率。


特点:

  1. 单方向 A->B B->A err
  2. 不具有传递性 A->B B->C A->C err
  3. 不具有继承特性(和儿子是朋友,和爸爸不一定是朋友;和爸爸是朋友,和儿子不一定是朋友;)


1.外部函数友元



注意

:主函数也是外部函数

Windows支持多线程,线程是调度单位,进程是资源单位

Linux有两种调度单位,进程、线程

class Int
{
private:
	int value;
public:
	Int(int x=0):value(x){}
	~Int(){}
	friend void fun();
};

void fun()
{
	value = 10;
}
int main()
{
	fun();
	return 0;
}

上述写法

错误

,类相当于一个图纸,应该访问类产生对象,没有对象就不用谈可访问性

class Int
{
private:
	int value;
public:
	Int(int x=0):value(x){}
	~Int(){}
	friend void fun(Int& it);
	friend int main();
};

void fun(Int& it)
{
	it.value = 10;
}
int main()
{
	Int a(0);
	fun(a);
	cout << a.value << endl;
	return 0;
}


2.成员函数友元


函数不是全局的,是某一类型的函数

void Object::fun(Int& it)的实现必须在class Int之后,否则编译不通过,因为要等Int识别完成后才能知道Int里面的内容

class Int;
class Object
{
public:
	void fun(Int& it);
};

class Int
{
private:
	int value;
public:
	Int(int x = 0) :value(x) {}
	~Int() {}
	friend void Object::fun(Int& it);
};

void Object::fun(Int& it)
{
	it.value = 100;
}
int main()
{
	Object obj;
	Int a(0);
	obj.fun(a);
	return 0;
}


3.类友元


如果Object中有多个方法,要都注册成友元就很麻烦,于是就有类友元

把Object注册成友元类,Object产生的对象,可以访问Int类型产生对象的公有、私有、保护

友元与访问限定符没有关系,没有公有、私有友元一说

class Int;
class Object
{
public:
	void fun(Int& it);
};

class Int
{
	friend class Object;
private:
	int value;
public:
	Int(int x = 0) :value(x) {}
	~Int() {}
};
void Object::fun(Int& it)
{
	it.value = 100;
}



版权声明:本文为weixin_45732685原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。