私有成员可以从同一个类的其他实例访问

Oli*_*ver 14 oop

我刚才注意到了一些我以前从未意识到的东西.事实证明这个类在C#中是有效的:

class Foo
{
    private string contents;

    public Foo(string str) {
        contents = str;
    }

    public void set(Foo other)
    {
        contents = other.contents;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,同一类的不同实例可以访问彼此的私有成员.

直到现在,我认为对象的私有成员只能被该对象访问,而不能被同一类的其他实例访问.发现这一点有点令人惊讶.

所有常见的面向对象语言都是这种情况吗?这对我来说并不直观.

jap*_*iss 14

如何为不通过公共方法公开其所有内部状态的类创建复制构造函数?

考虑这样的事情:

class Car
{
public:
    void accelerate(double desiredVelocity);
    double velocity() const;
private:
    Engine myEngine;
};
Run Code Online (Sandbox Code Playgroud)

它Car的公共接口不公开它Engine,但你需要它来制作副本.


pio*_*kuc 13

这与C++和Java中的相同:访问控制基于每个类而不是基于每个对象.

在C++中,Java和C#访问控制是作为静态编译时功能实现的.这样它就不会产生任何运行时开销.只有每类控制才能实现.