13友元函数好友元类

如果某个(些)外部函数需要直接访问类的数据成员,怎么办?

方法一:数据公有

方法二:友元

 

友元函数

1.友元函数是一般函数或其它类的成员函数

2.友元函数具有访问类的所有成员的权限

3.声明友元函数的方法:friend + 函数原型

4.除非能带来极大的便利,否则不要使用友元

 

示例:使用友元函数修改类的私有数据成员

   //文件triangle.h

   #if !defined __TRIANGLE__H__

   #define __TRIANGLE__H__

   class Triangle

   {friend void setA(Triangle &t, int n);

    public:

     Triangle(int x = 5,

              int y = 5, int z = 5);

     void print();

    private:

     int a, b, c;

   }; 

   #endif

   //文件triangle.cpp

   #include "triangle.h"

   #include <iostream.h>

   Triangle::Triangle(int x, int y, int z)

   {if (x+y>z && x+z>y && y+z>x)

     { a = x;  b = y;  c = z;}

    else

     { a = b = c = 5; }

   }

   void Triangle::print( )

   {cout<<"Triangle: "<<a<<", “

        << b <<", "<<c<<endl;

   }

   //文件ex12_5.cpp

   #include "triangle.h"

   void setA(Triangle &t, int n)

   {t.a = n;      //访问对象t的私有成员a

   }

 

   main()

   {Triangle t;

    t.print();

    setA(t, 10);

    t.print();

    return 0;

   }

 

 

友元类

1.一个类的友元类的所有成员函数都有访问类的所有成员的权限

2.友元类的声明方法:friend + class +类名

3.友元类的声明是单方面的

4.友元类的声明不是传递的

 

示例:

//文件class.h

   #if !defined __CLASS__H__

   #define __CLASS__H__

   class B

   {friend class A;          //声明友元类

    private:

     int data;

   };

   class A

   {public:

     void setB(B &b, int m);

     void print(B &b);

   };

   #endif

   //文件class.cpp

   //实现类A和B

   #include "class.h"

   #include <iostream.h>

   void A::setB(B &b, int m)

   {b.data = m;      //访问B的私有成员

   }

   void A::print(B &b)

   {

   //访问B的私有成员

   cout<<"The private data of class B: “

       <<b.data<<endl;

   }

 

   #include "class.h"

   main()

   {A a;

    B b;

//调用类A的成员函数修改类B的对象b的私有数据

    a.setB(b, 10);

//调用类A的成员函数访问类B的对象b的私有数据

    a.print(b);

    return 0;

   }

 

posted @ 2018-01-09 16:50  gd_沐辰  阅读(150)  评论(0编辑  收藏  举报