C++ 为什么隐私是基于每个类的,而const没有';不能跨同一类的对象工作?

C++ 为什么隐私是基于每个类的,而const没有';不能跨同一类的对象工作?,c++,class,private,information-hiding,C++,Class,Private,Information Hiding,出于好奇,我决定尝试一些东西,看看它是如何工作的。我想知道一个类的一个对象是否可以访问同一个类的另一个对象的私有变量。显然它可以,如果这个程序是任何指标: #include <iostream> using namespace std; class Colour { private: int var; public: void setVar(int x) { var = x; } int getVar() const

出于好奇,我决定尝试一些东西,看看它是如何工作的。我想知道一个类的一个对象是否可以访问同一个类的另一个对象的私有变量。显然它可以,如果这个程序是任何指标:

#include <iostream>

using namespace std;

class Colour
{
private:
    int var;
public:
    void setVar(int x)
    {
        var = x;
    }
    int getVar() const
    {
        return var;
    }
    int getOtherVar(Colour col) //steals the private var of another Colour object
    {
        return col.var;
    }
};

int main()
{
    Colour green;
    Colour red;

    green.setVar(54);
    red.setVar(32);

    cout << "Green is " << green.getVar() << endl;
    cout << "Red is " << red.getVar() << endl;
    cout << "Green thinks Red is " << green.getOtherVar(red) << endl;


    return 0;
}

我想,如果对象可以访问彼此的成员,那么
const
关键字不也应该保护同一类的其他对象不受更改吗?没有,我也不知道为什么。

当前的
getOtherVar
声明只是确保调用该方法的实例保持
const
。如果您希望强制执行所需的
col
无法修改

int getOtherVar(const Colour& col) const
{
    col.var = 67;    // <== this will not be allowed
    return col.var;
}
int getOtherVar(常量颜色和颜色)常量
{

col.var=67;//
const
成员函数使
const
仅成为调用该函数的对象,即
*this
。即,该成员函数的“hidden”参数
this
是指向const的指针。但这并不能避免修改
col
参数

要使另一个对象
const
,只需通过
const
参数传递它。在您的情况下,您可能希望通过
const
引用传递它:

int getOtherVar(const Colour& col) const
{
  col.var = 67;  // will not compile
  return col.var;
}
传递值将与函数参数的副本一起使用



至于按类访问,如果是按实例访问,您将如何实现复制/移动构造函数和赋值运算符?或其他函数,如二进制运算符等。

考虑以下论点:当您设计一个类时,您可以完全控制它的实现。这意味着保护memb没有多大意义其他类,甚至派生类,情况正好相反:这是其他人可能开发的东西。这就是保护你的类成员不受其他类影响的原因


至于
const
方法,不同之处在于隐藏参数
this
。非const方法的此参数类型为
Class*
,而const方法的此参数类型为
const Class*
。此规则不影响其他可能可变的参数,即使它们属于同一类。

@DanielLangr你能用一个例子写一个答案吗?
int getOtherVar(const Colour& col) const
{
  col.var = 67;  // will not compile
  return col.var;
}