我试图理解为什么同一个类的对象可以访问彼此的私有成员。其实我知道
访问修饰符适用于类级别,而不适用于对象级别。
来自here。但我不明白它的原因。我只能假设它与自动生成复制构造函数和复制赋值运算符(显然应该可以访问私有数据来复制它)相关联,但我不确定。实际上,一个类的任何不同实例都可以改变彼此的私有变量,例如:
,这看起来很奇怪#include <iostream>
class A{
int c;
public:
A():c(1){}
void f(A & a){
a.c = 2;
}
int getC(){return c;}
};
int main()
{
A a1;
A a2;
a1.f(a2);
std::cout << "A1 c " << a1.getC() << std::endl;
std::cout << "A2 c " << a2.getC() << std::endl;
return 0;
}
a1将改变a2.c,输出将为
A1 c 1
A2 c 2
感谢。
答案 0 :(得分:3)
您可以轻松解决此类对象级别的保护问题,因此我怀疑他们是否值得付出努力。也就是说,替换
void f(A &a) {
a.c = 2;
}
与
void f(A &a) {
a.update_c(2);
}
void update_c(int val) {
c = val;
}
答案 1 :(得分:2)
访问修饰符适用于类级别,而不适用于对象级别。
原因是编译器实际上并不知道任何特定的对象实例。在编译时,编译器只知道将要使用的类结构,而不是运行时内存中该类结构的特定实例。
公共/私有/受保护的访问控制是帮助架构师管理其他程序员如何使用其代码的功能。由于这是一种仅编码范例,因此对运行时代码几乎没有影响。编译器生成的代码完全没有这些访问控制。
简而言之,此功能以这种方式工作的原因是因为它只是为了帮助软件架构师。