友元函数
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
- 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明
- 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
- 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
- 友元函数的调用与一般函数的调用方式和原理一致。
#include <iostream>
using namespace std;
class temp
{
double value;
public:
friend void print(temp t) ;
void showvalue() const;
void setvalue(const double& val);
};
// 成员函数定义
void temp::setvalue(const double& val)
{
this->value = val;
}
// 成员函数定义
void temp::showvalue() const
{
cout << "成员函数得到:" << this->value << endl;
}
// 请注意:print不是任何类的成员函数
void print(temp t)
{
/* 因为 print 是 temp 的友元,它可以直接访问该类的任何成员 */
cout << "友元函数得到 : " << t.value << endl;
}
int main() {
temp t;
t.setvalue(10);
t.showvalue();
print(t);
system("pause");
}
运算符声明成类成员还是声明独立友元函数建议准则:
- C++规定,赋值运算符=、数组下标运算符口、函数调用运算符()、成员访问运算符->在重载时必须声明为类的成员函数
- 流运算符<<、>>、类型转换运算符不能定义为类的成员函数,只能是友元函数
- 一元运算符和复合赋值运算符重载时,一般声明类的成员函数
- 二元运算符在运算符重载时,一般声明为友元函数