1. 友元函数
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。
尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。申明友元函数的语句可以放在类中任意位置。
class A { public: A() : a(100) {} int GetA() { return this->a; } friend void SetA(A *p, int a); // 声明一个友元函数, 这个函数是这个类的好朋友, 自己内部的东西对好朋友开放 private: int a; }; // 这里提供一个指向A类对象的指针,或者也可以通过其它方法给该函数提供A类对象(任意一个A类对象),以便访问 void SetA(A *p, int a) { p->a = a; } int main() { A mya; cout << mya.GetA() << endl; SetA(&mya, 300); //通过友元函数 修改A类的私有属性 cout << mya.GetA() << endl; return 0; }
2. 友元类
若申明B类是A类的友员类,即A类中申明B类是自己的好朋友,则B类的所有成员函数都是A类的友员函数,
A类中的所有成员都像好朋友B开放。
友员类通常设计为一种对数据操作或类之间传递消息的辅助类。
class CCar { private: int price; friend class CDriver; //声明 CDriver 为友元类, 运行其访问自己的成员 }; class CDriver { public: CCar myCar; // 既然想访问对方,自然持有对方的对象(任意一个) void ModifyCar() // 改装汽车 { myCar.price += 1000; // 因CDriver是CCar的友元类,故此处可以访问其私有成员 } }; int main() { return 0; }
最后:无论友元函数还是友元类,都是一个类主动使用friend关键字申明想访问自己成员的其它类或者函数为自己的好朋友,这是一个允许
访问的过程,想去访问的函数或类是没有主动权的。
未完待续。。。。。。