友元函数
类具有封装性和隐蔽性,只有类的成员函数才能访问类的私有成员,友元函数可以访问其他类中的私有成员,有助于数据共享,提高程序效率。
特点:
- 单方向 A->B B->A err
- 不具有传递性 A->B B->C A->C err
- 不具有继承特性(和儿子是朋友,和爸爸不一定是朋友;和爸爸是朋友,和儿子不一定是朋友;)
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 版权协议,转载请附上原文出处链接和本声明。