C++友元函数案例

来源:互联网 发布:联盟挂机软件下载 编辑:程序博客网 时间:2024/05/27 00:33


1.假如我们想比较两个对象中的数据成员是否想等:

不想把一些函数写在类里面,因为有可能此种类中有判断是否相等的函数,其他类中也有这样的函数,那就想把此种函数做成一个大家都可以用的函数,不需在每个类中定义;

#include <iostream>using namespace std;class Student{   int m_age;   int m_num; public: Student(int age=0,int num=0):m_age(age),m_num(num){} //有参构造函数 friend void printInfo(Student &s);           //友元函数printInfo(); friend bool isEqual(Student &s1,Student &s2); //友元函数isEqual();};void printInfo(Student &s)                       //此处不需要告诉别人属于哪个类 //传递的是引用{cout<<s.m_age<<"==="<<s.m_num<<endl;//在这里可以直接操作定义成员函数}bool isEqual(Student &s1,Student &s2)           //此处传的是引用{return s1.m_age==s2.m_age&&s1.m_num==s2.m_num; // 判断两个成员里面的数据是否是相等的}void test(){Student s(1,20),s1(1,20);      // 构造两个成员变量 printInfo(s);                             //这里调用也没有说明是属于哪个类bool res=isEqual(s,s1);                   //将两个对象传入函数cout<<res<<endl;                              }int main (int argc,char *argv[]){test0();  return 0;}

2.上面代码实现了比较两个对象中的数据大小,打印函数printInfo()和isEqual()函数都属友元函数,这样就不需要在每个类中都定义一个这样的函数了;

3下面分析一下友元函数相关问题:

     1)友元函数的重要性:

  当一个函数想直接访问类里面的private成员变量,必须要写一个接口(函数),就是将该函数写成该类的友元函数,可以提高访问效率

     2)友元使用情况

   运算符重载

    3)友元函数分类

    (1)普通函数(非类的成员函数)是友元函数                      //上面讲的例子,就是普通函数的一个例子;

       (2)  一个类里面的成员函数是另一个类里面的成员函数     //这个例子接下来就会讲到

       (3)一个类是另外一个类的友元

4.友元的缺点

#include using namespace std;class A;class B{int m_num1,m_num2;public:     B(int num1=0,int num2=0):m_num1(num1),m_num2(num2){} int sum(A &a);};class A{  int m_num;  public:  A(int num=0):m_num(num){}  friend int B::sum(A &a); //b是a的友元类};int B::sum(A &a){                         //那么就可以在B定义的函数再接操作A里面的内容return m_num1+a.m_num;}class Num;class Calculator{public:int sum(Num &n1,Num &n2);int minus(Num &n1,Num &n2);int multiply(Num &n1,Num &n2);};class Num{int m_num;public:Num(int num=0):m_num(num){}     friend class Calculator;};int Calculator::sum(Num &n1,Num &n2){return n1.m_num+n2.m_num;}int Calculator::minus(Num &n1,Num &n2){ return n1.m_num-n2.m_num;}int Calculator::multiply(Num &n1,Num &n2){return n1.m_num*n2.m_num;}int main(){Num n1(10),n2(5);Calculator cal;cout<using namespace std;class Student  {int m_score; public:    Student(int score=0):m_score(score){}//    void test();int operator+(Student &s)                //operator标记符{return this->m_score+s.m_score;}Student & operator++()//(int)             //++ 用成员函数{      ++this->m_score;  return *this;}Student  operator++(int)//(int)          //后面价格int{   Student temp=*this;       this->m_score++;   return temp;   //不能返回局部变量的引用}    int getAge(){  return this->m_score;}friend int operator+(Student &s1,Student &s2) ;         //operate标记符      friend ostream& operator<<(ostream &out,const Student &s );    friend istream& operator>>(istream &in,Student &s );    friend bool operator&&(const Student &s1,const Student &s2);friend bool operator!(const Student &s);  friend bool operator==(const Student &s1,const Student &s2);};  ostream& operator<<(ostream &out,const Student &s )      //输出流重载  cout{out<<"score="<>(istream &in,Student &s )           //输入流重载   cin{ cout<<"score"; in>>s.m_score; return in;}int operator+(Student &s1,Student &s2)                  //加号重载   + //operator标记符    {return s1.m_score+s2.m_score;}   bool operator==(const Student &s1,const Student &s2)     //是否想等的引用 ==   {return s1.m_score==s2.m_score;      }      bool operator&&(const Student &s1,const Student &s2)    //&&{return s1.m_score!=0 && s2.m_score!=0;}    bool operator!(const Student &s)                        //!{    return !s.m_score;}int main(){Student s1(1),s2(2);cout<<"s1,s2相与"<<(s1&&s2)<>s;           //输入操作符重载cout<
违背了C++里面的封装思想,尽量少用;