effective c++ 条款03讲到:Use  const whenever possible 由此可见const 限定符对于c++的重要性。下面尽可能全面的总结const 的用法和技巧。主要资料来源于c++ primer,标题后的页码为c++ primer 中文版(第四版)的页码。
  (一) const限定符(p49)
  定义const对象时要初始化
  除非特别说明,在全局作用域声明的const变量是定义该对象为文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问
  通过制定const变量为extern ,可以在其他文件中访问const对象   (extern const int bufsize = 1)
  (二)const引用(p51)
  const引用是指向const对象的引用,不能将非const引用绑定到const对象,但可以将const引用绑定到非const对象。const引用可以初始化为不同类型的对象或者初始化为右值。
  (三)const变量在头文件中的使用(p59)
  如果const变量是用常量表达式初始化的,那么将它放在头文件中。反之,则放在源文件中。
  (四)const和指针(p110)
  1.指向const对象的指针
  指向const对象的指针必须具有const特性(const double *ptr),ptr本身不是const,在定义时不需要初始化,可以允许给ptr重新赋值,但是不能通过ptr修改其所指对象的值
  不能使用void *保存const对象的地址,而必须使用const void*
  允许把非const对象的地址赋给指向const对象的指针,但同样不能使用指针修改对象的值。
  2.const指针
  const指针必须在定义时初始化,可以通过指针修改对象的值。
  3.指向const对象的const指针
  const double pi = 3;
  const double *const pi_ptr = π
  既不能修改pt_ptr所指向对象的值,也不能修改指针的指向。
  4.const形参(p200)
  如果函数参数是非引用的非const形参,则既可给该函数传递const实参也可以传递非const的实参。
  如果函数形参定义为非引用的const类型,则既可以传递const对象也可以传递非const对象。在函数中不可以改变实参的局         部副本
  5.指向const对象的指针形参和指向非const对象的指针形参(p200)
  当函数形参为指向const对象的指针(const int *)时,可以使用指向const对象的指针(const int *)作为实参也可以使用指向非             const对象的指针(int *)既普通指针初始化形参
  当函数形参为指向非const对象的指针(int *) 时,则只能将指向非const对象的指针(int *)传递给函数,而不能将指向const         对象的指针传递给函数。
  (五) const引用做形参(p205)
  应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参既不能使用const对象初始化,也不能使用字面值或产生右值的表达式初始化
  (六)重载和const形参(p235)
  可基于函数的引用形参是指向const对象还是指向非const对象,实现函数重载。将引用形参定义为const来重载函数是合法的。
  Record lookup(Account&);
  Record lookup( const Account &); //new function
  注意不能基于指针本身是否为const来实现函数的重载:
  f(int *)
  f(int * const) // redeclaration
  (七)const成员函数
  const成员函数不能修改调用该函数的对象。
  const 对象、指向const对象的指针或引用只能用于调用其const成员函数,如果尝试用它们调用非const成员函数,则是错误的