const

Директива const , как следует из названия , просто защищает объект от изменения.

Везде где только можно используйте const, для передаваемых параметров, для возвращаемых параметров, для функций,.. Это значительно облегчает работу компилятору.

Изначально сам объект может быть и не const, а при передачи ссылки на него например в функцию можно указать const , чтобы никто в функции не захотел изменить этот объект.

Синтаксис const и * (указатель)

Если const находится слева от символа *, то этот const не дает менять данные на которые указывает указатель. Но сам указатель можно поменять и он будет указывать на другие данные.

Если const справа от *, то этот const не дает менять сам указатель, но данные на которые указывает указатель менять можно.

Во всяком случае на Qt 4.8.1 msvc-2010 (C < C11) это так.

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    const char * ptr1 = "ptr1";
    ptr1="ptr1_1"; // ок
    //*ptr1=0x44; or *ptr1='p';  // error : you cannot assign to a variable that is const

    char const * ptr2 = "ptr2";
    ptr2="ptr2_2"; // ок
    //*ptr2=0x44; or *ptr2='b';  // error : you cannot assign to a variable that is const
    //ptr2 = ptr1; // ok
    qDebug() << "ptr2 : " << ptr2;

    char * const ptr3 = "ptr3";
    // ptr3="c";     // error : you cannot assign to a variable that is const
    // *ptr3 = 0x55; // compiling ok : run error
    // ptr3 = ptr2;  // error : cannot convert from 'const char *' to 'char *const '
    // *ptr3 = 'p';  // compiling ok : run error
    qDebug() << "ptr3 : " << ptr3;

    // два const можно использовать
    const char * const ptr7 = "ptr7";
    // ptr7 = ptr2;    // error : you cannot assign to a variable that is const
    // *ptr7 = 0x44;   // error : you cannot assign to a variable that is const
    // ptr7 = &*ptr1;  // error : you cannot assign to a variable that is const
    qDebug() << "ptr7 : " << ptr7;

    // два указателя const
    // const  char ** pptr1 = &ptr1; // ok
    const  char ** pptr1 = &ptr2;   // ok
    pptr1 = &ptr1;
    qDebug() << "*pptr1 : " << *pptr1;

    char const ** pptr2 = &ptr1;
    pptr2 = &ptr2;
    // pptr2 = &ptr3;   // error : cannot convert from 'char *const *' to 'const char **'
    qDebug() << "*pptr2 : " << *pptr2;

    char *const * pptr3 = &ptr3;
    qDebug() << "*pptr3 : " << *pptr3;

    return app.exec();
}
вывод
ptr2 :  ptr2_2
ptr3 :  ptr3
ptr7 :  ptr7
*pptr1 :  ptr1_1
*pptr2 :  ptr2_2
*pptr3 :  ptr3

const и функции

const в завершении объявления функции (когда это метод класса) контролирует, что переменные класса из этой функции не изменяются.

class A {
private:
  int x;
public:
  void f(int a) const {
    x = a; // <-- ошибка
  }
};

Но если очень хочется изменить одну переменную класса из такой функции, то переменную помечаем mutable.

Вообще const везде где только можно помогает компилятору быстрее делать свою работу.

Передача параметров const в функцию

Здесь const актуально только для параметров передаваемых по ссылке, указателю и массивов. Для прередаваемых по значению параметров const не актуален, хотя ничем и не запрещен.

Файлы для скачивания