一、C++的访问控制
在任何关系中,设立相关各方面都遵从的边界很重要。需要控制对结构成员的访问有两个理由:1)让客户程序员远离一些他们不需要的工具(他们很容易知道什么是重要的,什么是可以忽略的);2)允许库的设计者改变内部实现,而不必担心会对客户程序员产生影响。
访问控制通常是指实现细节的隐藏。
public意味着在其后声明的所有成员可以被所有的人访问。
private意味着除了该类型的创建者和类的内部成员函数之外,任何人都不能访问。
protected意味着就这个类的用户而言,它是private的,但它可被从这个类继承的任何类使用。
友元(friend):允许一个不属于当前结构的成员函数访问当前结构中的数据。一个friend必须在一个结构内声明。可以把一个全局函数声明为friend,也可以把另外一个结构中的成员函数甚至整个结构都声明为friend。嵌套的结构并不能自动获得访问private成员的权限,要获得访问私有成员的权限,必须遵守特定的规则:首先声明一个嵌套的结构,然后声明它是全局范围使用的一个friend,最后定义这个结构(结构的定义必须与friend声明分开,否则编译器将不把它看做成员)。
二、对象布局
在一个特定的“访问块”(被访问说明符限定的一组声明)内,这些变量在内存中肯定是连续存放的(然而这些访问块本身可以不按声明的顺序在对象中出现)。虽然编译器通常都是按访问块出现的顺序给它们分配内存,但并不是一定要这样,因为特定机器的体系结构和操作环节可对private成员和protected成员提供明确的支持,将其放在特定的内存位置上。
程序开始运行之前,所有的访问说明信息都消失了(访问说明信息通常是在编译期间消失的)。
三、类(class)
class中的成员默认为private,而struct中的成员默认为public。
易碎的基类问题(fragile base-class problem):程序员无论何时修改了一个类,无论修改的是公共的接口部分还是私有成员的声明部分,他都必须再次编译包含头文件的所有文件。