C++ 在类c+的方法中访问类的私有变量+;

C++ 在类c+的方法中访问类的私有变量+;,c++,private,access-specifier,C++,Private,Access Specifier,我试图理解为什么同一类的对象可以访问彼此的私有成员。事实上我知道 访问修饰符在类级别工作,而不是在对象级别工作 从。但我不明白其中的原因。我只能假设它与复制构造函数和复制赋值操作符的自动生成有关(显然应该可以访问私有数据来复制它),但我不确定。实际上,一个类的任何不同实例都可以改变彼此的私有变量,这看起来很奇怪,例如: #include <iostream> class A{ int c; public: A():c(1){} void f(A & a){ a

我试图理解为什么同一类的对象可以访问彼此的私有成员。事实上我知道

访问修饰符在类级别工作,而不是在对象级别工作

从。但我不明白其中的原因。我只能假设它与复制构造函数和复制赋值操作符的自动生成有关(显然应该可以访问私有数据来复制它),但我不确定。实际上,一个类的任何不同实例都可以改变彼此的私有变量,这看起来很奇怪,例如:

#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;
}

谢谢。

您可以轻松解决此类对象级保护问题,因此我怀疑它们是否值得付出努力。即更换

void f(A &a) {
    a.c = 2;
}

访问修饰符在类级别工作,而不是在对象级别工作

这是因为编译器实际上不知道任何特定的对象实例。在编译时,编译器只知道将要使用的类结构,而不知道运行时内存中该类结构的特定实例

公共/私有/受保护的访问控制是帮助架构师控制其他程序员如何使用其代码的功能。由于这是一个仅编码的范例,它对运行时代码几乎没有影响。编译器生成的代码与这些访问控制完全不同


因此,简而言之,此功能以这种方式工作的原因是,它仅用于帮助软件架构师。

如果同一类的对象无法访问彼此的私有成员,您将如何实现副本构造函数?在线程中,你mention@Archimaredes我认为这是可能的,例如,我可以为每个私有变量添加getter方法,但我同意这将不可能自动生成副本构造函数等@djf你是对的,谢谢我必须阅读Tony D解释你的第一段一针见血。
void f(A &a) {
    a.c = 2;
}
void f(A &a) {
    a.update_c(2);
}
void update_c(int val) {
    c = val;
}