在C++中关于友元函数的进一步理解

2020-01-06 19:52:09王旭

这里重新将类的成员函数的定义看一下:

百科上的认识:

类的成员函数的原型要写在类体中,原型说明了函数的参数表和返回值类型。而函数的定义一般在类外面,也可以直接在类内部定义。前者与普通函数不同的是,实现成员函数时要指明类的名称,具体形式为:

  • 返回值类型 类名 :函数成员名(参数表){函数体};
  • 而后者一般为一些短小的函数(5行以内),也就是内联函数。

    这里在百科上对友元函数的解释:

    友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。

    1.为什么要使用友元函数

    优点:能够提高效率,表达简单、清晰。

    也有缺点:破坏了程序的封装性。有时候不到万不得已的时候才使用。

    代码解释:

    
    #include <iostream>
    #include <string>
    using namespace std;
    class ca {
      string id;
      void setId(string s) {
        id = s;
      }
    protected:
      string name;
      void setName(string s) {
        name = s;
      }
    public:
      void print() {
        cout << id << " " << name << " " << endl;
      }
      friend void fun(ca& a);  //申明全局函数作友元,允许它访问私有保护成员
    };
    class derive : public ca { };  //ca类的派生类
    void fun(ca& a) {    //作友元的函数要定义在那个类的后面
      a.id = "987";    //这是ca类的私有成员
      a.setName("xyz");  //这是ca类的保护成员
    }
    int main ( )
    {
      ca a;
      //a.fun(...);  //友元函数不是当前类的成员函数,所以这句编译出错
      fun(a);
      a.print();
      derive d;
      fun(d);  //作参数时,类型转换为ca类
      d.print();
      return 0;
    }