class Accumulator
{
private:
int m_value;
public:
Accumulator() { m_value = 0; }
void add(int value) { m_value += value; }
// Make the reset() function a friend of this class
friend void reset(Accumulator &accumulator);
};
// reset() is now a friend of the Accumulator class
void reset(Accumulator &accumulator)
{
// And can access the private data of Accumulator objects
accumulator.m_value = 0;
}
int main()
{
Accumulator acc;
acc.add(5); // add 5 to the accumulator
reset(acc); // reset the accumulator to 0
return 0;
}
我的意思是在这里使用友方函数有什么用?我认为重置已经是一个成员函数,它可以轻松访问Class Accumulator的私有成员变量。
答案 0 :(得分:0)
它不是一个成员函数,但它会更加OOP并与add
函数一致,只需使reset
成为public
成员函数。
class Accumulator
{
private:
int m_value;
public:
Accumulator() { m_value = 0; }
void add(int value) { m_value += value; }
void reset();
};
// reset() is now a member of the Accumulator class
void Accumulator::reset()
{
m_value = 0;
}
int main()
{
Accumulator acc;
acc.add(5); // add 5 to the accumulator
acc.reset(); // reset the accumulator to 0
return 0;
}
答案 1 :(得分:0)
语法reset(acc);
工作reset
需要是一个自由函数,而不是一个需要语法acc.reset()
进行调用的成员函数。
免费功能void reset(Accumulator &accumulator)
与class Accumulator
无关,因此无法访问私人会员m_value
。
friend声明更改了后者,并为free函数提供了与Accumulator
的成员函数相同的访问权限。
请注意,这在重载运算符时特别有用。例如。 operator +
应始终声明为自由函数,通常作为朋友。
答案 2 :(得分:0)
reset
不是会员功能。实际上,此代码说明了成员函数add
和非成员函数reset
之间的语法差异,并带有friend
名称。
虽然两个函数都可以访问成员变量,但add
可以通过分配m_value
直接执行,而reset
必须明确指定accumulator
。
成员/非成员差异也显示在呼叫站点上,因为add
使用成员语法调用,即acc.add(5)
,而reset
使用非成员调用语法,即reset(acc)
。