使用friend关键字和引用时,我有意外的行为。这是代码:
#include <iostream>
class Modifier;
class A{
private:
int _a;
friend Modifier;
};
class B : public A {};
class Modifier
{
public:
void f(A& i) { i._a = 10; std::cout << i._a << std::endl; }
};
int main()
{
Modifier m;
B b;
m.f(b);
}
// Output
// 10
B不能修改变量_a。有人可以向我解释这怎么可能吗?
最佳答案
B不能修改变量_a_a
及其包含的对象是非常量的,因此可以修改_a
。将成员声明为私有并不会阻止变量被修改。访问说明符仅影响可访问变量名称的范围。
类B
不会修改变量_a
。是Modifier::f
修改_a
变量(它是变量A
的b
基本子对象的成员)。 Modifier
是A
类的朋友,因此Modifier
的成员函数可以访问A
的私有声明名称。具有访问权限意味着它可以使用名称A::_a
。