C++将struct/class的成员保护粒度划分为:public、protected、private,这在语言入门时就应知晓的。然而前几天遇到的一段代码,却让我琢磨了许久:
class Record
{
public:
Record& operator= (const Record& r)
{
file = r.file;
offset = r.offset;
return *this;
}
...
private:
unsigned char *offset;
NBFile &file;
...
};
为什么作为private成员的offset和file可以直接通过成员访问运算符访问?
我开始意识到自己对成员保护机制的认识有误,不知从什么时候起"对象.私有成员"的模式在大脑中就被一票否定了,这意味着默认了成员保护机制是针对对象的。然而,"The Annotated C++ Reference Manual"对保护机制的精辟总结:
(1) Protection is provided by compile-time mechanisms against accident, not against fraud or explicit violation.
(2) Access is granted by a class, not unilaterally taken.
(3) Access control is done for names and does not depend on the type of what is named.
(4) The unit of protection is the class, not the individual object.
(5) Access is controlled, not visibility
明确指出成员保护机制是针对类的,且为编译时机制。仔细一想,C++从来就未有在运行时检查成员访问合法性的机制,所有的检查都在编译期完成,此时根本不会产生对象,因而之前对该机制的认知是有问题的。BTW,第一点总结得甚好,运行时可通过私有成员指针在外部访问的原因应该很清楚了吧(这被认为是fraud,:P)。
生活、工作中会有各种各样认知误区,与自己认知相悖的,不一定是错误的,要搜寻客观证据,理性思考。