编码标准:
- 封装和隔离。
- 在声明一个类的时候,应避免暴露出其私有成员。
- 应该使用一个形如“struct Xxxxlmpl *pimpl_”的不透明的指针来存储私有成员(包括状态变量和成员函数)。
使用pimpl(编译器防火墙)可以大大降低代码之间的相互依赖性,对于pimpl_需要注意:
- pimpl_中存储的是私有变量和私有成员函数。
- 一般需要一个反向指针(习惯称为self_)来调用可见类的函数。
- 即使虚拟函数是私有的,也不能把虚拟成员函数隐藏在pimpl类中。
文章来源:
http://my.donews.com/robinchow/2007/01/13/qwtfsgyamrxaxddpwhxeyatxgntnrlthhnna/
Koenig Lookup:
如果你给函数提供一个 class 类型的实参,那么在名称搜索时,编译器将认为包含实参类型的命名空间中的同名函数的可选函数。
接口原则:
对于一个类X,所有的函数,包括自由函数,只要同时满足
就是X的逻辑组成部分,因为它们组成了X的接口。
接口原则与 Koenig lookup 的行为相同,因为 Koenig lookup 的行为正是建立在接口原则的基础上的。
小结:
- 接口原则:对于 class X,所有的函数,包括自由函数,只要同时满足(a)“提及”X,(b)与 X“同期提供”,那么它就是X的逻辑组成部分,因为它们是 X 的接口的一部分。
- 因此,成员和非成员函数都是一个 class 的逻辑组成部分。只不过成员函数比非成员函数有更强的关联关系。
- 在接口原则中,对“同期提供”的最有用的解释是“出现在相同的头文件和/或命名空间中”。如果函数与 class 出现在相同的头文件中,在依赖性分析时,它是此 class 的组成部分。如果函数与类出现在相同的命名空间中,在对象引用和名称搜索时,它是此 class 的组成部分。
文章来源:
http://my.donews.com/robinchow/2007/01/14/tlcchrdcrthuzvbqdhrczbijwughfpwzbybi/
C++ 中的内存区域分为6块:
- 常量数据区:存储字符串等在编译期间就能确定的值。类对象不能存在与这个区域中。在程序的整个生存周期内,区域中的数据都是可用的。区域内的所有数据都是只读的,任何企图修改本区域数据的行为都会造成无法预料的后果。
- 栈区:存储自动变量。栈区中,内存一旦被分配,对象就立即被构造好了;对象一旦被销毁,分配的内存也立即被收回。
- 自由存储区:是 C++ 的两个动态内存区域之一,使用 new 和 delete 来予以分配和释放。
- 堆区:是另一个动态存储区域,使用 malloc、free 以及一些相关变量来进行分配和回收。
- 全局/静态区:在程序启动时才被分配,而且可能直到程序开始执行的时候才被初始化。比如,函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化的。对那些跨越了编译单元的全局变量进行初始化操作的顺序是没有被明确定义的,因而需要特别注意管理全局对象(包括静态类对象)之间的依赖关系。
另外注意,C++ 标准对于堆和自由存储区是否有联系没有予以详细说明,不同编译器可能有不同的实现。
文章来源:
http://my.donews.com/robinchow/2007/01/14/kvdartgbqpsrlrmsxjgnplhdrqqyqtkapnag/