友元函数可能会破环原类的私有属性:
声明有缘函数关键字;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;
}