友元
- 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; }
- 使用整个函数还可以将输出写入到文件中。
- 第一个重载版本
- 重载<<运算符
- 非成员函数应该是友元函数。
来源:https://www.cnblogs.com/yangzixiong/p/11973939.html