C++第04课 友元
1.友元
friend关键字,友元赋予对象具有打破权限限定的一个功能,并不是能够直接访问类中数据
2.友元函数
在类中用friend修饰的函数 称之为友元
在友元函数中 的对象具有打破权限限定,以一个对象为参数或者在当前函数中定义的对象,友元函数不属于类,所以不受权限限定
+ 普通函数是友元函数
class Girl { friend void print(Girl obj); friend Girl* returnObj(); public: string name; protected: int age; private: int money; }; //友元函数不属于类,在类外实现时不需要类名限定 void print(Girl obj) { obj.age = 19; obj.money = 19999; obj.name = "ILoveYou"; } Girl* returnObj() { Girl* p = new Girl; p->name = "小可爱"; p->money = 10000; p->age = 18; return p; } int main() { Girl g; g.name = "hello"; //脱离了友元函数就受权限限定,打破权限仅限在友元函数中 cout << returnObj()->name << endl; //无法访问 //g.age = 12; //g.money = 1230; return 0; }
+ 另一个类型的成员函数是友元函数
MM类中有一个友元函数是GG类的成员函数叫做print(MM obj)
声明MM类型: class MM
GG类定义: class GG{ .... }
MM类定义 class MM{ .... }
Bf函数的实现 GG::print(MM obj){}
//固定写法 class MM; class GG { public: string name; void print(MM obj); protected: void print() { cout << name << endl; } }; class MM { friend void GG::print(MM obj); public: string name; protected: void print() { cout << name << endl; } };
3.友元类
在A类中声明B类为友元类,B类中所有A类的对象都具有无视权限限定的一个功能。
class A { friend class B; public: A(int a):a(a){} protected: int a; private: void print() { cout << a << endl; } }; class B { public: void print(A obj) { cout << obj.a << endl; obj.print(); } protected: int b; private: void print() { cout << b << endl; } };