友元

友元#

  • c++控制对类私有部分的访问。

  • 友元有3种。

    • 友元函数
      • 例子 A = 2.34 * B;
      • 非成员函数不是由对象调用,它使用所有值都是显式参数。
      • Time operator*(double m, const Time & t);
      • 但有时候非成员函数不可以调用成员数据。然而有一种特殊的非成员函数可以访问类的私有成员,他们被称为友元函数。
    • 友元类
    • 友元成员函数
  • 通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。

  • 创建友元函数

    • 创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend。
    • friend Time operator*(double m, const Time& t);
    • 上述原型意味着一下两点。
      • operator*()函数是在类声明中声明的,但他不是成员函数,因此不能使用成员运算符来调用。
      • operator*()不是成员函数,但它与成员函数访问权限相同。
    • 第二步是编写函数定义。
      • 因为它不是成员函数,所以不要使用Time::限定符。另外不要再定义函数头使用friend。
    • 当函数定义也是原型时,需要加friend关键字。
  • 常用的友元

    • 重载<<运算符
      • 第一个重载版本
        • 因为第一个操作数是ostream类对象cout,所以需要使用友元函数。
        • 而且没有使用到ostream中的私有部分,所以只需要作为Time类的友元函数。
        • 在类中声明friend void operator<<(ostream & os, const Time & t);
    void operator<<(ostream & os, const Time & t)
    {
        os << t.hours << "hours, " << t.mintes << "minutes";
    }
    
      * 第二个重载版本
          - 上述实现不允许如下语句
          - cout << trip << "hhh";
          - 因为后面的字符串需要ostream对象来接收,然而之前的实现中没有返回ostream对象。
          - 改进
    
    ostream & operator<<(ostream & os, const Time & t)
    {
        os << t.hours << "hours, " << t.mintes << "minutes";
        return os;
    }
    
      * 使用整个函数还可以将输出写入到文件中。
    
  • 非成员函数应该是友元函数。

posted @ 2019-12-02 23:17  yangzixiongh  阅读(170)  评论(0编辑  收藏  举报