Const correctness
Last updated
Was this helpful?
Last updated
Was this helpful?
Использование const в C++ крайне важно. Кто не знаком с данной темой, рекомендую про const correctness все прочитать:
1.
2. Правило 3: Везде, где только можно, используйте const в книге Эффективное использование С++. 55 верных способов улучшить структуру и код ваших программ | Мейерс Скотт
Функции, которые не изменяют внутреннее состояние объекта важно помечать const. Это позволит избежать кучу потенциальных ошибок на уровне компиляции. Дополнительно, при виде const другой разработчик при чтении сразу понимает, что функция ничего не изменяет внутри объекта:
Аналогичо, если мы не планируем менять значение перменной — добавляем к ней const. Простейший пример — мы совершили ошибку, вместо оператора сравнения == использовали оператор присваивания =
При передаче по константной ссылке, мы не создаем копию объекта при вызове функции. В большинстве случаев это не повлияет на работу программы (из-за размера объекта или из-за отсутсвия конструктора копирования), но лучше сразу приучать себя к правильному стилю, это позволит избежать ошибок в более сложных случаях.
В консоль выведется следующее:
Что произошло?:
1. Вызвался конструктор при создании объекта MyOwnType myOwnObj;
2. Вызываем первую функцию, без константной ссылки: у нас вызвался конструктор копирования (где может быть достаточно сложное и глубокое копирование в общем случае) и на выходе из функции объект уничтожается, вызывается деструктор. То есть произошло два дополнительных вызова функции внутри:
3. Вызываем вторую функцию, по константной ссылке: конструктор копирования не вызывается, так же как и деструктор:
4. Вызвался деструктор нашего объекта, который мы создали в начале:
Рассмотрим пример (рекомендую создать консольное приложение в VS или протестировать онлайн — ):