dem*_*ing 78 c++ private access-specifier
我了解到我永远不能访问私有变量,只能使用类中的get函数.但是为什么我可以在复制构造函数中访问它?
例:
Field::Field(const Field& f)
{
pFirst = new T[f.capacity()];
pLast = pFirst + (f.pLast - f.pFirst);
pEnd = pFirst + (f.pEnd - f.pFirst);
std::copy(f.pFirst, f.pLast, pFirst);
}
Run Code Online (Sandbox Code Playgroud)
我的声明:
private:
T *pFirst,*pLast,*pEnd;
Run Code Online (Sandbox Code Playgroud)
aio*_*obe 105
访问修饰符在类级别上工作,而不在对象级别上工作.
也就是说,同一类的两个对象可以访问彼此的私有数据.
主要是由于效率.如果访问修饰符在对象级别上工作,则this == other每次访问时都要检查是否存在不可忽略的运行时开销other.x.
如果从角度范围的角度来考虑它,它在语义上也是合乎逻辑的:"在修改私有变量时,我需要记住大部分代码吗?" - 您需要记住整个类的代码,这与运行时中存在的对象是正交的.
在编写复制构造函数和赋值运算符时,它非常方便.
Ton*_*roy 30
恕我直言,现有的答案很难解释这个"为什么" - 过分关注重复什么行为是有效的."访问修饰符在类级别上工作,而不是在对象级别上工作." - 是的,但是为什么?
这里的首要概念是,程序员正在设计,编写和维护一个类,这个类被期望理解所需的OO封装并有权协调其实现.因此,如果您正在编写class X,那么您不仅要编码X x具有访问权限的代码如何使用单个对象,还要编写如何:
X对象合作提供预期的行为,同时尊重您的设计中的后置条件和不变量.它不仅仅是复制构造函数 - 很多操作都可能涉及到类的两个或更多实例:如果你要进行比较,添加/乘法/除法,复制构造,克隆,分配等等,那么通常就是你的情况或者只是必须访问另一个对象中的私有和/或受保护数据,或者希望它允许更简单,更快速或通常更好的函数实现.
具体来说,这些操作可能希望利用特权访问来执行以下操作:
shared_ptrs引用数据等.auto_ptr<>将所有权"移动"到正在建造的对象unordered_map成员但公开只暴露begin()和end()迭代器 - 直接访问size()您可以reserve更快地复制; 更糟的是,如果他们只会暴露at()和insert()否则throw....小智 11
为了理解答案,我想提醒你一些概念.
this 调用时,指针被传递给每个函数.现在是因为this指针,函数能够定位该特定实例的变量.无论是公共私人.它可以在该函数内访问.现在,如果我们将指针传递给同一个类的另一个对象.使用这个第二个指针,我们将能够访问私人成员.
希望这能回答你的问题.
复制构造函数是类的成员函数,因此可以访问类的数据成员,甚至是那些声明为'private'的成员.