繁体   English   中英

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

[英]C++ passing reference to class' private variable - compiler issue?

在类中通过私有变量的引用传递是否可以在该类之外直接更改? 还是编译器“应该”避免这种情况?

例:

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

我需要使用其他/不同的对象来做这样的事情,这些对象对于所有者类是私有的,但是在需要时可以被其他人更改。 我想要的最后一件事是这种练习,以后再回来给我发牢骚。

本质上让我担心的是,我想将类/结构基本上视为指向缓冲区的指针,而将成员的地址视为该缓冲区的偏移量,因此,即使您传递成员的指针值,它也会没有它所属的类/结构的基址指针就没有用。 我本能地认为应该是这种情况,因此上面的示例甚至不可能出现。

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

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

编辑2:

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

这不是一个好习惯。 如果您想让其他对象修改您的对象,请继续

朋友班和朋友功能

通过私有成员完全可以。 您应通过将其设为const方法来指示VisitOthers()不会更改您的对象。 如果方法是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM