我了解到我永远无法访问私有变量,只能使用类中的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;
答案 0 :(得分:101)
访问修饰符适用于类级别,而不适用于对象级别。
也就是说,同一个类的两个对象可以访问彼此的私有数据。
主要是因为效率。如果访问修饰符在对象级别上工作,每次访问this == other
时,检查other.x
是否是一个不可忽略的运行时开销。
如果从角度范围的角度考虑它,它在语义上也是合乎逻辑的:“在修改私有变量时,我需要记住大部分代码吗?” - 您需要记住整个类的代码,这与运行时中存在的对象是正交的。
编写复制构造函数和赋值运算符时非常方便。
答案 1 :(得分:32)
您可以从类中访问类的私有成员,甚至是其他实例的私有成员。
答案 2 :(得分:27)
这里的首要概念是,程序员正在设计,编写和维护一个类,这个类被期望理解所需的OO封装并有权协调其实现。因此,如果您正在编写class X
,那么您不仅要编码具有访问权限的代码如何使用单个X x
对象,还要编写如何:
X
个对象合作以提供预期的行为,同时尊重您的设计中的后置条件和不变量。这不仅仅是复制构造函数 - 很多操作都可能涉及到类的两个或更多实例:如果你要比较,添加/乘法/除法,复制构造,克隆,分配等等,那么它通常是您只需要访问另一个对象中的私有和/或受保护数据,或者希望它允许更简单,更快速或通常更好的函数实现。
具体而言,这些操作可能希望利用特权访问来执行以下操作:
shared_ptr
以引用数据等。auto_ptr<>
“将”所有权移至正在构建的对象unordered_map
成员,但只公开begin()
和end()
迭代器 - 直接访问size()
您可以reserve
容量以便更快地复制;更糟糕的是,如果他们只展示at()
和insert()
以及其他throw
.... 答案 3 :(得分:11)
为了理解答案,我想提醒你一些概念。
this
指针在被调用时传递给每个函数。现在由于this
指针,函数能够找到该特定实例的变量。无论是公共私人。它可以在该函数内访问。现在,如果我们将指针传递给同一个类的另一个对象。使用这个第二个指针,我们将能够访问私人成员。
希望这能回答你的问题。
答案 4 :(得分:6)
复制构造函数是类的成员函数,因此可以访问类的数据成员,甚至是那些声明为'private'的成员。