【问题标题】:Why is privacy on a per-class basis but const doesn't work across objects of the same class?为什么每个类都有隐私但 const 不适用于同一类的对象?
【发布时间】:2020-11-03 09:36:26
【问题描述】:

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

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

我有点期待它会以某种方式失败,即类的每个唯一实例都只能访问 其自己的私有成员。我做了一些研究,发现隐私is a class-specific thing, not an instance-specific thing.

无论如何,我决定进一步试验,发现有些东西有点令人困惑。我编辑了getOtherVar() 的实现并将其变成了这样:

    int getOtherVar(Colour col) const
    {
        col.var = 67;
        return col.var;
    }

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

【问题讨论】:

  • @DanielLangr 你能用一个例子写一个答案吗?

标签: c++ class private information-hiding


【解决方案1】:

const 成员函数使const 仅成为您为其调用该函数的对象,即*this。也就是说,该成员函数的“隐藏”参数this 是一个指向常量的指针。但这并不能避免修改col参数。

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

int getOtherVar(const Colour& col) const
{
  col.var = 67;  // will not compile
  return col.var;
}

按值传递将与函数参数的副本一起使用。


对于按类访问,如果改为按实例访问,您将如何实现复制/移动构造函数和赋值运算符?或者其他函数,比如二元运算符等...

【讨论】:

    【解决方案2】:

    getOtherVar 的当前声明只是确保调用该方法的实例仍然是const。如果你想强制 col 不能修改你想要的

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-10-07
        • 2011-06-18
        • 2021-07-18
        • 2016-06-16
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-24
        相关资源
        最近更新 更多