使用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 。有人可以解释一下这是怎么可能的吗?
答案 0 :(得分:2)
B不能修改变量_a
_a
和包含它的对象是非常量的,因此可以修改_a
。将成员声明为私有并不会阻止变量被修改。访问说明符仅影响可访问变量名称的范围。
类B
不会修改变量_a
。 Modifier::f
修改了_a
变量(它是变量A
的{{1}}基础子对象的成员)。 b
是Modifier
类的朋友,因此A
的成员函数可以访问Modifier
的私有声明名称。具有访问权限意味着它可以使用名称A
。
答案 1 :(得分:0)
B
已经无法修改_a
,因为它已在B
中声明为私有。只能在A
中访问。如果您需要从_a
阅读B
,请使用受保护的吸气剂:
class A {
protected:
auto get_a() const { return _a; }
private:
int _a;
friend Modifier;
};
答案 2 :(得分:0)
朋友类可以访问其他被声明为朋友的类的私有和受保护成员。因此,_a
可以通过类Modifer
的任何方法进行修改。但是,B
无法修改_a
,因为它在类A
中定义为私有。例如,如果您要在类f
中实现方法B
,则会出现编译器错误,提示'int A::_a' is private
class B : public A {
void f(A& i) { i._a = 10; std::cout << i._a << std::endl; }
};