1. 数据有效性
2. 数据安全性
::放在一个名字前,表示使用该名字的另一个版本,他不属于任何对象的成员。
即使一个程序没有直接的创造任何 const 对象,他也可能通过函数调用创造大量的 const 对象。
一般风格使用 struct 表示简单类型,公开其数据结构。
将一个成员函数的实现写在类定义里面,暗示编译器尽可能的内联展开。
构造函数执行的几个步骤:
1. 分配内存空间,保存这个对象。
2. 执行构造函数初始化列表,初始化这个对象。
3. 执行构造函数的函数体。
辅助函数的优点:将工作分开,一些成员用于提供接口,另一些成员用于处理实现。
这里可以以一个模板容器类Vec(标准库中Vector的简单版)的设计、构造思路为例:
首先,确定以系统分配的“数组”方式来储存数据。由此确定需要的初始数据, data,limit,avail,allocator<T> 。
其次,确定提供给用户的构造函数,以及必有得拷贝构造函数和析构函数。
然后,确定提供给用户访问数据的方式,即 operator[] , begin , end , size.
最后,实现相应辅助函数,实现接口提供给用户的功能。
通常,迭代器本身也是一个类,该类应该包含一个指针,并且实现 ++ 操作符。
索引操作应该返回元素的引用,添加操作应该在系统分配的内存中创建一个等同的对象。
如果一个类需要析构函数,那么他也必然需要一个拷贝构造函数和一个赋值函数。
复制不是初始化(初始化包括拷贝构造)。前者需要删除左操作数已有的值(如果存在动态内存分配),并且返回的是左操
作数的引用,注意自我赋值的情形。