Директива 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 не актуален, хотя ничем и не запрещен.
Файлы для скачивания
*
Qt 4.8.1 msvc2010
*
Qt 4.8.1 msvc2010