const позволяет определять типизированные константы.
     double const pi = 3.14;
 const int days[4] = {31, 28, 31, 30 };
 double * pi_ptr = (double *) π
 *pi_ptr = 5;
 int a = 10;
 const int * p1 = &a; // указатель на константу
 int const * p2 = &a; // указатель на константу
 *p1 = 20; // ошибка
 p2 = 0; // ОК
 int * const p3 = &a; // константный указатель
 *p3 = 30; // ОК
 p3 = 0; // ошибка
 int const * const p4 = &a; // константный указатель на константу
 *p4 = 40; // ошибка
 p4 = 0; // ошибка
const делает неизменяемым тип слева от него.
     int a = 10;
 int * p = &a;
 // указатель на константный указатель на int
 int * const * p2 = &p;
 // константный указатель на указатель на int
 int ** const p3 = &p;
 int a = 10;
 int & const b = a; // ошибка
 int const & c = a; // ссылка на константу
 Point midpoint (Segment const & s);
rvalue.
     Point p = midpoint ( Segment(Point(0,0), Point(1,1)) );
const.
     struct IntArray {
     size_t size() const;
 };
this - указатель на const) IntArray const * p = foo();
 p->resize(); // error
const является частью сигнутуры метода, метод с const и метод без - это перегрузка функции. Константный метод вызывается по ссылке или указателю на константу, в противном случае вызывается неконстантный метод.mutable. struct IntArray {
     void foo () const {
         // нарушение логической константности
         data_[10] = 1;
     }
 }