为什么我们在这里创建朋友功能.C ++

时间:2017-12-25 12:36:34

标签: c++

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的私有成员变量。

3 个答案:

答案 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)