c++友元详解

来源:互联网 发布:js颜色值 编辑:程序博客网 时间:2024/03/29 03:51

近日重新看了一下C++友元,有了新的理解,如有理解有偏差,请指出,不胜感激!

我们知道,类的三大特性:封装、继承、多态。类具有隐藏内部实现细节的特性,仅暴露出接口给用户使用,但有时候我们也赋予某个函数(成员或非成员)或某个类访问非公有成员或函数的权利,这个正是友元存在的意义!

关于“友元”,可能你觉得这两个字比较抽象,你就理解有“朋友”好了。比如说,你允许让某个朋友去你家(访问类的非公有成员),你就告诉阿汪“阿汪,这是我“朋友”,可以让他进来,其他人还是要吠他!”。

使用起来也不复杂,只要把需要赋予访问特权的函数(成员或非成员)或类的放到需要被访问的类里面声明就可以了。至于放到public、protected、private,那个都没关系。

友元分为两种:友元函数和友元类

1. 友元函数:

(1)非成员函数作为友元函数:

//abc.h

class CSum
{
   friend int add(CSum sum); //友元函数
public:
   CSum(int x, int y){m_x = x;m_y = y;}
private:
 void print(){}
   int m_x;
   int m_y;
};

//abc.cpp

int add(CSum sum)
{
   return sum.m_x + sum.m_y;
}

(2)成员函数作为友元函数:

//abc.h

class CSum;

class CPrintSum
{
public:
   void printSum(CSum sum);
};

class CSum
{
   friend void CPrintSum::printSum(CPrintSumsum);  //成员函数作为友元函数
public:
  CSum(int x, int y){m_x = x;m_y = y;}
private:
   int m_x;
   int m_y;
};

//abc.c

void CPrintSum::printSum( CSum sum )
{
 std::cout<<sum.m_x<<" " << sum.m_y;
}

 

2. 友元类

如果想某个类的所有成员函数都能访问另一个类的非公有成有,友元类就用上了!当然,你不觉得累的话也可以使用“成员函数作为友元函数”,一个个的声明。

//abc.h

class CPrintSum
{
public:
  void printX(CSum sum);
 void printY(CSum sum);
 void printSum(CSum sum);

};

class CSum
{
 friend class CPrintSum;
public:
 CSum(int x, int y){m_x = x;m_y = y;}
private:
 int m_x;
 int m_y;
};

 

//abc.c

void CPrintSum::printX( CSum sum )
{
 std::cout<<sum.m_x;
}

void CPrintSum::printY( CSum sum )
{
 std::cout<<sum.m_y;
}

void CPrintSum::printSum( CSum sum )
{
 std::cout<<sum.m_x<<" " << sum.m_y;
}

一个friend class CPrintSum,三个成员函数都搞定!

0 0
原创粉丝点击