Kei*_*ith 91 c++ private-members
为什么同一类的对象可以访问彼此的私有数据?
class TrivialClass {
public:
TrivialClass(const std::string& data) :
mData(data) {};
const std::string& getData(const TrivialClass& rhs) const {
return rhs.mData;
};
private:
std::string mData;
};
int main() {
TrivialClass a("fish");
TrivialClass b("heads");
std::cout << "b via a = " << a.getData(b) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个代码有效.对象a完全可以从对象b访问私有数据并将其返回.为什么会这样?我认为私人数据是私人的.(我开始试图理解pimpl习语中的复制构造函数,但后来我发现我甚至不理解这种简单的情况.)
AnT*_*AnT 74
因为这就是它在C++中的工作方式.在C++中,访问控制基于每个类而不是基于每个对象.
C++中的访问控制是作为静态编译时功能实现的.我认为很明显,在编译时实际上不可能实现任何有意义的每对象访问控制.只有每类控制才能实现.
受保护的访问规范中存在一些每对象控制的提示,这就是为什么它甚至在标准中有自己的专用章节(11.5).但是,那里描述的任何每个对象的特征仍然相当简陋.同样,C++中的访问控制意味着在每个类的基础上工作.
vse*_*har 28
"私人"并不是一种真正的访问控制机制,因为"我在facebook上制作了我的照片,因此你无法看到它们."
在C++中,"私有"只是说这些是你(类的编码器)在未来版本中可能会改变的类的一部分,等等,你不希望其他编码人员使用你的类来依赖它们的存在或功能.
如果您想要真正的访问控制,您应该实现真正的数据安全技术.
Jac*_*Zhu 12
这是一个很好的问题,我最近遇到过这个问题.我与同事们进行了一些讨论,这是我们讨论的总结:这是设计的.这并不意味着这种设计对于所有情况都是完全合理的,但必须考虑为什么选择每个类私有.我们可以想到的可能原因包括:
首先,每个实例访问控制的成本可能非常高.这个帖子中的其他人已经讨论过这个问题.理论上,这可以通过此指针检查来完成.但是,这不能在编译时完成,并且只能在运行时完成.因此,您必须在运行时识别每个成员的访问控制,并且当它被违反时,可能只会引发异常.成本很高.
其次,每个类访问控制都有自己的用例,比如copy constructor或operator =.如果每个实例都有访问控制,那么很难实现它们.
此外,访问控制主要来自编程/语言角度,用于如何模块化/控制对代码/成员的访问,而不是数据.
诀窍是记住数据是private给类的,而不是类的实例。类中的任何方法都可以访问该类的任何实例的私有数据;除非您禁止显式访问其他实例的私有数据成员的方法,否则无法将数据保持在实例内私有。
Yee*_*Fei -9
私有数据将一直保持私有状态,直到有权访问该数据的人将其透露给其他人为止。
这个概念也适用于其他情况,例如:
class cMyClass
{
public:
// ...
// omitted for clarity
// ...
void Withdraw(int iAmount)
{
iTheSecretVault -= iAmount;
}
private:
int iTheSecretVault;
};
Run Code Online (Sandbox Code Playgroud)
怎么会有人把钱取出来呢?:)
| 归档时间: |
|
| 查看次数: |
28675 次 |
| 最近记录: |