C ++传递引用类的私有变量 - 编译问题?

时间:2010-09-18 08:19:45

标签: c++ pass-by-reference private-members

类中的私有变量的引用传递是否可以在类可接受的实践之外直接更改?或者这是编译器“应该”选择并阻止的东西吗?

示例:

//-------------------------------------------
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

我需要使用其他/不同的对象执行类似的操作,对于所有者类是私有的,但在需要时可由其他人更改。我想要的最后一件事就是让这种做法回归&amp;将来记住我。

基本上让我担心的是,我希望将类/结构视为基本上是指向缓冲区的指针,并将成员的地址视为偏移到此缓冲区中,这样即使您传递指针值也是如此如果没有它所属的类/结构的基指针,它将是无用的。这就是我本能地认为应该是这种情况,所以上面的例子甚至不可能。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

作为该类的设计者,C ++不会阻止您将类私有成员的引用分发给任何人。但是,建议将此类访问限制为仅授权实体,例如朋友,在这种情况下,访问这些私人成员并不是一个真正的大问题,因为它是“按设计”。

编辑2:

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

答案 2 :(得分:1)

这不是好习惯。 如果您希望其他对象修改您的对象,请转到

朋友类和朋友功能

答案 3 :(得分:1)

传递私人会员是完全可以的。你会指出VisitOthers()不会通过使它成为const方法来改变你的对象。如果方法是:

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

您将收到编译器错误,因为您只允许将PrivateString作为const对象传递。尽管你通过const和你的评论指出哪些方法实际上改变了你的对象的状态,这是非常重要的。