友元

不羁岁月 提交于 2019-12-06 08:50:18

友元

  • 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;
        }
      • 使用整个函数还可以将输出写入到文件中。
  • 非成员函数应该是友元函数。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!