友元的特点
- 友元不会改变访问方式,只会改变权限。
- 友元不具有传递性(不会传给子类)。
- 友元是单向的,类A是类B的友元,不代表类B就是类A的友元。
1.普通函数成为友元
class MyClass
{
public:
MyClass(int num) { m_num = num; }
friend void func(); //友元
private:
int m_num;
};
void func()
{
MyClass Class1(10);
cout << Class1.m_num << endl; //直接使用private的数据
}
int main()
{
func();
return 0;
}
friend void func();
将全局函数func视为友元,在func函数中就可以使用类中private权限的数据了。
2.以另一个类的成员函数成为友元
class FriendClass
{
public:
void func(); //函数声明
};
class MyClass
{
public:
MyClass(int num) { m_num = num; }
friend void FriendClass::func();
private:
int m_num;
};
//定义
void FriendClass::func()
{
c myc(1);
cout << myc.m_num << endl; //FriendClass访问MyClass的private数据
}
和普通函数一个道理。
3.友元类
friend class MyClass;
声明友元类,该类中的所有函数都能获得当前类中的最高权限private。
在实际工作中,除非确实有必要,否则,一般并不把整个类声明为友元类。而只将确实有需要的成员函数声明为友元函数,这样更方便安全一些。