我了解到我永远无法访问私有变量,只能使用类中的 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);
}
我的声明:
private:
T *pFirst,*pLast,*pEnd;
原文由 demonking 发布,翻译遵循 CC BY-SA 4.0 许可协议
恕我直言,现有的答案在解释这个“为什么”方面做得很差——过于关注重申什么行为是有效的。 “访问修饰符在类级别上起作用,而不是在对象级别上。” - 是的,但是为什么?
这里的总体概念是,设计、编写和维护一个类的程序员应该理解所需的 OO 封装并有权协调其实现。因此,如果您正在编写
class X
,那么您所编码的不仅仅是单个X x
对象可以由可以访问它的代码使用,还包括如何:X
对象 合作 提供预期的行为,同时尊重设计中的后置条件和不变量。也不仅仅是复制构造函数 - 大量操作可能涉及您的类的两个或多个实例:如果您正在比较、添加/乘法/除法、复制构造、克隆、分配等,那么您通常会遇到这种情况要么只是必须访问另一个对象中的私有和/或受保护数据,要么希望它允许更简单、更快或通常更好的功能实现。
具体来说,这些操作可能希望利用特权访问来执行以下操作:
shared_ptr
引用数据等。auto_ptr<>
“移动”所有权到正在建设的对象unordered_map
成员,但仅公开公开begin()
和end()
迭代器 - 可直接访问size()
你可以reserve
更快复制的能力;更糟糕的是,如果他们只公开at()
和insert()
否则throw
….