考虑以下程序:
#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);
请指导。
答案 0 :(得分:3)
你可以在同一个类的成员函数中访问私有成员。 A::show
是 A
的成员,可以访问 A
的所有成员。
如果不是这样,私人成员将是一个大麻烦。考虑这个例子:
class C {
int x;
void foo() {
x = 42;
}
};
C
将所有成员设为私有,foo
无需与他们成为朋友即可访问 x
。 friend
仅适用于在您认为合适时希望以受控方式打破封装的特殊情况。
此外,我建议您查看书中解释成员函数的部分。您的 show
不使用 this
(当前对象),因此它可能是一个免费函数(在这种情况下,您实际上需要将其设为好友才能访问私有成员)。虽然我认为它应该是:
void A::show(const B& y) {
a = 10;
cout << "A::a=" << a << " B::b=" << y.b;
}
您也不应该在名为 show
的方法中分配给成员,然后该方法应声明为 const
。但一次做一件事,我不想完全改变你的代码。