2

类中私有变量的引用传递是否在该类可接受的实践之外直接更改?或者这是编译器“应该”采取和防止的事情?

例子:

//-------------------------------------------
class Others
{
public:
 Others() {};
 void ChangeIt(string &str) { str = "Changed by Others"; }
};

//-------------------------------------------
class Locals
{
private:
 string PrivateString;
public:
 Locals() { PrivateString = "Set by Locals"; };
 void VisitOthers() { Others o; o.ChangeIt(PrivateString); }
 const string GetString() { return PrivateString; }
};

//-------------------------------------------
int main(void)
{
 Locals lo;
 cout << lo.GetString() << "\n";
 lo.VisitOthers();
 cout << lo.GetString() << "\n";
 return 0;
}

输出:

Set by Locals
Changed by Others

我需要使用其他/不同的对象来做这样的事情,这些对象是所有者类私有的,但在需要时可以由其他人更改。我想要的最后一件事是让这种练习在未来回来并责备我。

本质上让我担心的是,我想将类/结构基本上视为指向缓冲区的指针,并将成员的地址视为该缓冲区的偏移量,这样即使您传递成员的指针值,它也会如果没有它所属的类/结构的基指针,它将毫无用处。这是我本能的感觉应该是这样的,所以上面的例子甚至不应该是可能的。

4

4 回答 4

5

没有什么可以阻止的,您通过引用传递您的私人成员。您正在调用的函数没有访问您的私有成员,它正在更改它自己的参数(恰好是某个类的成员)。代码没问题,但重要的是您调用的函数不会保留对您的私有成员的引用。

于 2010-09-18T08:25:50.137 回答
2

作为类的设计者,C++ 不会阻止您将类私有成员的引用分发给任何人。然而,将此类访问限制为仅授权实体(例如朋友)可能是明智的,在这种情况下,对此类私人成员的访问并不是真正的大问题,因为它是“设计使然”。

编辑2:

类的变异版本operator[]通常还为外部实体提供一个接口来修改私有成员。

于 2010-09-18T08:28:32.143 回答
1

这不是好的做法。如果您希望其他对象修改您的对象,请选择

Friend 类和 Friend 函数

于 2010-09-18T08:30:03.663 回答
1

通过私人成员是完全可以的。您将表明 VisitOthers() 不会通过使其成为 const 方法来更改您的对象。如果方法是:

void VisitOthers() const {Other o; o.visit(PrivateString);}

你会得到一个编译器错误,因为你只允许将 PrivateString 作为一个 const 对象传递。尽管通过 const 和注释指出哪些方法实际上改变了对象的状态,但这一点非常重要。

于 2010-09-18T08:44:10.207 回答