出于好奇,我决定尝试一些东西,看看它是如何工作的。我脑子里想的是一个类的一个对象是否可以访问同一个类的另一个对象的私有变量。显然可以,如果这个程序是任何指标:
#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关键字不也应该保护同一类的其他对象不受更改吗?没有,我也不知道为什么。
发布于 2020-07-14 05:36:28
const成员函数使const只成为您调用该函数的对象,即*this。也就是说,该成员函数的“隐藏”参数this是指向const的指针。但这并不能避免修改col参数。
要使另一个对象const,只需通过const参数传递它。在您的示例中,您可能希望通过const引用传递它:
int getOtherVar(const Colour& col) const
{
col.var = 67; // will not compile
return col.var;
}传递值将使用函数参数的副本。
至于每类访问,如果是每个实例,您将如何实现复制/移动构造函数和赋值运算符?或其他函数,如二进制运算符等.
发布于 2020-07-14 05:36:11
getOtherVar的当前声明只是确保调用该方法的实例保持为const。如果您希望强制执行不能修改col的操作,则需要
int getOtherVar(const Colour& col) const
{
col.var = 67; // <== this will not be allowed
return col.var;
}发布于 2020-07-14 05:40:46
考虑一下这个论点:当您设计一个类时,您可以完全控制它的实现。这意味着保护这个类的其他成员不受你的伤害是没有什么意义的.对于其他类,甚至派生类,情况正好相反:这是其他人可能开发的东西。这就是保护您的班级成员不受其他类的影响的原因。
对于const方法,区别在于隐参数this。非const方法具有Class*类型的参数,const方法具有const Class*类型的参数.这个规则不影响其他可能是可变的参数,即使它们属于同一个类。
https://stackoverflow.com/questions/62888584
复制相似问题