友元函数和友元类

来源:互联网 发布:sony vegas mac破解版 编辑:程序博客网 时间:2024/06/05 21:14

对于友元函数和友元类的印象一直是停留在最初的教学课本上,自己从来没有在实际的程序开发中应用过。最近在别人的代码中看到了友元函数和友元类,才发现自己除了知道“友元函数“和”友元类”这两个词以外,其他的竟然都不记得了。现在结合自己的理解和查阅的资料来记录下友元函数和友元类,以防日后再次忘记。



为什么要用友元函数和友元类


众所周知,类具有封装性和隐藏性。对于类的私有成员和保护成员,只有类的成员函数才能访问。但是在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,从而影响程序的运行效率。为了解决上述问题,提出一种使用友元的方案。友元的作用在于提高程序的运行效率,但是它破坏了类的封装性和隐藏性,所以还是建议少用为好,这里我只是作为备忘的一个记录而已。



友元函数


友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的。另外,一个函数可以是多个类的友元函数,只需要在各个类中分别声明即可。


友元函数声明格式:
      friend  类型 函数名(参数列表);


例一:普通函数作友元函数

#include <iostream>using namespace std;class MyClass{public:MyClass() :m_a(0), m_b(0){};~MyClass(){};friend void TestPrint(MyClass& object);/// 声明友元函数protected:int m_b;void Print_B(){ cout << "m_b = " << m_b << endl; }private:int m_a;void Print_A(){ cout << "m_a = " << m_a << endl; }};void TestPrint(MyClass& object){/// 访问MyClass类的私有变量和保护变量object.m_a = 1;object.m_b = 2;/// 访问MyClass类的私有函数和保护函数object.Print_A();object.Print_B();}int main(){MyClass object;TestPrint(object);}

例二:其它类的成员函数作友元函数     请特别注意本例中的代码注释。否则编译出错!)

#include <iostream>using namespace std;/// 提前声明MyClass_B类,否则MyClass_B编译出错class MyClass_A;/// 在MyClass_A类之前定义MyClass_B类,否则在MyClass_A类里申明友元函数编译出错class MyClass_B{public:MyClass_B(){};~MyClass_B(){};void TestPrint(MyClass_A& object);};class MyClass_A{public:MyClass_A() :m_a(0), m_b(0){};~MyClass_A(){};friend void MyClass_B::TestPrint(MyClass_A& object);/// 声明友元函数protected:int m_b;void Print_B(){ cout << "m_b = " << m_b << endl; }private:int m_a;void Print_A(){ cout << "m_a = " << m_a << endl; }};//友元函数的实现必须在MyClass_A类的后面,否则编译出错,MyClass_A类的成员未定义void MyClass_B::TestPrint(MyClass_A& object){object.m_a = 1;object.m_b = 2;object.Print_A();object.Print_B();}int main(){MyClass_A object_a;MyClass_B object_b;object_b.TestPrint(object_a);}

例三:利用友元函数重载运算符

#include <iostream>using namespace std;class CPoint{public:CPoint(int x = 0, int y = 0){ m_X = x; m_Y = y; }~CPoint(){};/// 声明友元函数friend CPoint operator++(CPoint& point);friend CPoint operator+(CPoint& point1, CPoint& point2);void Print(){cout << "m_X = " << m_X << endl;cout << "m_Y = " << m_Y << endl;}private:int m_X;int m_Y;};/// 单目运算符 ++CPoint operator++(CPoint& point){point.m_X++;point.m_Y++;return point;}/// 双目运算符 +CPoint operator+(CPoint& point1, CPoint& point2){return CPoint(point1.m_X + point2.m_X, point1.m_Y + point2.m_Y);}int main(){CPoint point;++point;/// 或operator++(point)point.Print();CPoint point1(1, 1);CPoint point2(1, 1);point = point1 + point2;point.Print();}


友元类


友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类

  1. 友元关系不能被继承。
  2. 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
  3. 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。

友元类声明格式:
      friend  class 友元类类名;

#include <iostream>using namespace std;class MyClass_A{public:MyClass_A() :m_a(0), m_b(0){};~MyClass_A(){};friend class MyClass_B;/// 声明友元类protected:int m_b;void Print_B(){ cout << "m_b = " << m_b << endl; }private:int m_a;void Print_A(){ cout << "m_a = " << m_a << endl; }};class MyClass_B{public:MyClass_B(){};~MyClass_B(){};void TestPrint(MyClass_A& object){/// 访问MyClass_A类的私有变量和保护变量  object.m_a = 1;object.m_b = 2;/// 访问MyClass_A类的私有函数和保护函数  object.Print_A();object.Print_B();}};int main(){MyClass_A object_a;MyClass_B object_b;object_b.TestPrint(object_a);}


特别说明:本文中部分文字信息摘自百度百科。如有雷同,请莫见怪。


0 0
原创粉丝点击