1 让自己习惯C++

~~~~~~~~~~~~~~~~
1.1 尽量以const,enum,inline替换#define
=========================================
   1. 用宏写出的函数,最好用template inline函数代替
1.2 尽可能用const
==================
   1. 如果关键字const出现在*左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量
   2. const iterator就像声明指针为const一样(T* const),表示这个迭代器不得指向不同的东西,但它所指的东西的值可以改变.
      如果希望迭代器所指的东西不可变动(模拟const T*),需要从const_iterator
   3. 令函数返回一个const值,可以防止对返回值进行赋值
   4. 两个成员函数如果只是常量性不同,可以被重载
 

 
  1. class A 
  2.   { 
  3.       public
  4.       char str[100]; 
  5.       char& tb(int i){
    return str[i];} 
  6.       const char& tb(int i) const {
    return str[i];} 
  7.   } 

   5. 编译器强制实现bitwise constness,但编写程序时应该使用概念上的常量性(conceptual constness).
      这时可以用mutable关键字释放掉non-static成员变量的bitwise constness约束
   6. 当const和non-const成员函数实质上等价的实现时,可以令non-const版本函数调用const版本函数,而不能反过来.(因为承诺不改动对象的const函数调用可能改动对象的non-const函数,是错误的)
 

 
  1. class A 
  2.   { 
  3.       public
  4.       char str[100]; 
  5.       const char& tb(int i) const {
    return str[i];} 
  6.       char& tb(int i) 
  7.       { 
  8.       return const_cast<char&>(       //将const函数的返回值const移除 
  9.           static_cast<const TextBlock&>(*this)  //为*this加上const,强迫调用的是const版本的函数 
  10.               .tb(i);                           //调用tb方法                         
  11.       } 
  12.   } 

1.3 确定对象被使用前已经先被初始化
===================================
   1. 如果某编译单元内的某个non-local static对象的初始化动作用到了另一个编译单元的某个non-local static对象,它所用到的这个对象可能尚未初始化,因为C++对定义于不同编译单元内部的non-local static对象的初始化次序无明确定义.
      可以将non-local static对象搬到一个函数内成为local static对象,并让该函数返回一个reference指向该对象(类似与Singleton模式),这样就能保证对象初始化了