add boost::udp codes
非 const 变量默认为 extern。要使 const 变量能够在其他的
文件中访问，必须地指定它为 extern。

通常，头文件中应该只定义确实必要的东西。请养成这
个好习惯。

使用 const_iterator 类型时，我们可以得到一个迭代器，它自身的值可以
改变，但不能用来改变其所指向的元素的值。可以对迭代器进行自增以及使用解
引用操作符来读取值，但不能对该元素赋值。

任何改变 vector 长度的操作都会使已存在的迭代器失效。例
如，在调用 push_back 之后，就不能再信赖指向 vector 的迭
代器的值了。

由于后自增操作的优先级高于解引用操作，因此 *iter++ 等效于*(iter++)。
后自增操作的结果是返回对象自增前的值！！！

int *matrix[10]; // array of 10 pointers
int (*matrix)[10]; // pointer to an array of 10 ints

f(int *);
f(int *const); // redeclaration
此时,const 用于修改指针本身,而不是修饰指针所指向的类型。在上述两种情
况中,都复制了指针,指针本身是否为 const 并没有带来区别。正如前面第 7.8
节所提到的,当形参以副本传递时,不能基于形参是否为 const 来实现重载。

不完全类型（incomplete type）只能以有限方式使用。不能定
义该类型的对象。不完全类型只能用于定义指向该类型的指针
及引用，或者用于声明（而不是定义）使用该类型作为形参类
型或返回类型的函数。

必须对任何 const 或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。
尽可能避免使用成员来初始化其他成员。

只有当一个类没有定义构造函数时，编译器才会自动生成一个默认构造函数。

因为 static 成员不是任何对象的组成部分，所以 static 成员函数不能被
声明为 const。毕竟，将成员函数声明为 const 就是承诺不会修改该函数所属
的对象。最后，static 成员函数也不能被声明为虚函数

如果类需要析构函数，则它也需要赋值操作符和复制构造函
数，这是一个有用的经验法则。这个规则常称为三法则，指
的是如果需要析构函数，则需要所有这三个复制控制成员。

析构函数与复制构造函数或赋值操作符之间的一个重要区别是，即使我们编
写了自己的析构函数，合成析构函数仍然运行（在自定义析构执行完后执行合成析构函数）

赋值操作符可以重载。无论形参为何种类型，赋值操作符必须
定义为成员函数，这一点与复合赋值操作符有所不同

重载算数操作符 + 重载转换（比如重载+，重载int()转换）会产生二义性
重载构造函数 +　重载转换　容易产生二义性（explicit可以解决这个二义性，但最好还是从根本上不产生二义性）

非虚函数总是在编译时根据调用该函数的对象、引用或指针的类型而确定。

如果派生类定义了自己的复制构造函数，该复制构造函数一般应显式使用基
类复制构造函数初始化对象的基类部分
赋值操作符通常与复制构造函数类似：如果派生类定义了自己的赋值操作
符，则该操作符必须对基类部分进行显式赋值

如果删除基类指针，则需要运行基类析构函数并清除基类的成员，如果对象
实际是派生类型的，则没有定义该行为。要保证运行适当的析构函数，基类中的
析构函数必须为虚函数

template <class Parm, class U>
Parm fcn(Parm* array, U value)
{
Parm::size_type * p;
}
我们知道 size_type 必定是绑定到 Parm 的那个类型的成员，但我们不知
道 size_type 是一个类型成员的名字还是一个数据成员的名字，默认情况下，
编译器假定这样的名字指定数据成员，而不是类型
如果希望编译器将 size_type 当作类型，则必须显式告诉编译器这样做：
template <class Parm, class U>
Parm fcn(Parm* array, U value)
{
typename Parm::size_type * p; // ok: declares p to be a pointer
}

编写模板代码时，对实参类型的要求尽可能少是很有益的。

任意类（模板或非模板）可以拥有本身为类模板或函数模板的成员，这种成
员称为成员模板，成员模板不能为虚。

对具有同一模板实参集的同一模板，程序不能既有显式特化又有实例化
在类特化外部定义成员时，成员之前不能加 template<> 标记。

为了确定 auto_ptr 是否指向一个对象，可以将 get 的返回值与 0 比较。
应该只用 get 询问 auto_ptr 对象或者使用返回的指针值，不能用 get 作为创建其他 auto_ptr 对象的实参。

C++ 不赞成文件静态声明。不造成的特征是在未来版本中可能不支持的特征。应该避免文件静态而使用未命名空间代替。

无论虚基类出现在继承层次中任何地方，总是在构造非虚基类之前构造虚基类。

C 函数的指针与 C++ 函数的指针具有不同的类型，不能将 C函数的指针初始化或赋值为 C++ 函数的指针（反之亦然）。