C++类的友谊

时间:2021-06-28 14:31:21

标签: c++ oop friend

考虑以下程序:

#include <iostream>
    using namespace std;
     
    class B;
    class A {
        int a;
    public:
        A():a(0) { }
        void show(A& x, B& y);
    };
     
    class B {
    private:
        int b;
    public:
        B():b(0) { }
        friend void A::show(A& x, B& y);
    };
     
    void A::show(A& x, B& y) {
        x.a = 10;
        cout << "A::a=" << x.a << " B::b=" << y.b;
    }
     
    int main() {
        A a;
        B b;
        a.show(a,b);
        return 0;
    }

这个问题让我感到困惑的是,在A类内部,我们还没有将function show声明为A类的友元函数。那么我们如何在类A中使用值xa(它是A类的私有数据成员) show() 函数的定义?

据我所知,如果以这种方式定义,show 函数应该是 A 类的友元函数:

friend void show(A& x, B& y);

请指导。

1 个答案:

答案 0 :(得分:3)

你可以在同一个类的成员函数中访问私有成员。 A::showA 的成员,可以访问 A 的所有成员。


如果不是这样,私人成员将是一个大麻烦。考虑这个例子:

class C {
     int x;
     void foo() {
         x = 42;
     }
};

C 将所有成员设为私有,foo 无需与他们成为朋友即可访问 xfriend 仅适用于在您认为合适时希望以受控方式打破封装的特殊情况。


此外,我建议您查看书中解释成员函数的部分。您的 show 不使用 this(当前对象),因此它可能是一个免费函数(在这种情况下,您实际上需要将其设为好友才能访问私有成员)。虽然我认为它应该是:

 void A::show(const B& y) {
    a = 10;
    cout << "A::a=" << a << " B::b=" << y.b;
 }

您也不应该在名为 show 的方法中分配给成员,然后该方法应声明为 const。但一次做一件事,我不想完全改变你的代码。

相关问题