友元函数和友元类
友元函数的特性:
1.首先它是不属于这个类的函数,它可以是全局函数,也可以是另外一个类的成员函数。
2.定义放在类中和类外没有区别。
3.声明放在类的 public 和 private 没有区别。
4.友元函数不属于类,所以没有this指针。
5.友元函数不能被继承。
友元函数的作用:
1.可以直接访问类的私有成员。
2.使用时,需要在类中加以声明。
格式如下:
friend 类型 函数名(形式参数);
#include <iostream> using namespace std; class A { private: int num; void printNum() { cout << "调用函数输出 num:" << num <<endl; } // 友元函数声明 friend void printclassA(A &a); }; // 友元函数定义,希望它可以访问A的私有成员(也可以在类中定义,但它不适于类) void printclassA(A &a) { a.num = 101; //给私有变量赋值 a.printNum(); //调用私有函数 } int main(int argc, char *argv[]) { A a; printclassA(a); return 1; } 输出: 调用函数输出 num:101
友元类的特性:
1.友元关系不能被继承。
2.友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
3.友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的声明。
友元类的作用:
1.如果类A希望类B可以访问它的私有成员,可以在类A把类B设置为友元类。
#include <iostream> using namespace std; class A { // 把B设置为A的友元类,希望B可以访问A的私有成员 friend class B; private: int num; void printNum() { cout << "调用函数输出 num:" << num << endl; } }; class B { public: void printclassA(A &a) { a.num = 101; //给私有变量赋值 a.printNum(); //调用私有函数 } }; int main(int argc, char *argv[]) { A a; B b; b.printclassA(a); return 1; } 输出: 调用函数输出 num:101
总结,为什么要引入友元函数,它的的优缺点:
优点:在实现类之间数据共享时,减少系统开销,提高效率。
缺点:破环了封装机制。