Синтаксис С++
За годы преподавания C++ я узнал, что подавляющее большинство программистов C++ (включая
самых опытных) редко пользуется некоторыми возможностями языка. Конечно,
дело это сугубо
индивидуальное, но при всей сложности и глубине C++ небольшой обзор не повредит никому. В этой и
двух следующих главах я постараюсь выровнять уровень подготовки читателей перед тем, как пе-
реходить к действительно интересным темам. Эта глава не заменит Annotated Reference Manual или
другое справочное руководство — вы не найдете в ней полной спецификации языка. Я лишь
рассмотрю
некоторые языковые средства, которые часто понимаются неверно или не понимаются
вовсе. Придержите шляпу и приготовьтесь к стремительному облету синтаксиса C++!
Переменные и константы
Болтовню о том, что такое переменные и для чего они нужны, пропускаем. Нашего внимания
заслуживают две темы: константность и сравнение динамических объектов со стековыми.
const
Ключевое слово
const
, которое в разных контекстах
принимает разные значения, одно из самых
информативных в C++. Да, между этими значениями есть кое-что общее, но вам все равно придется
запомнить все конкретные случаи.
Константные переменные
Если переменная объявлена с ключевым словом
const
, значит, она не должна меняться.
После
определения константной переменной вы уже не сможете изменить ее значение или передать ее в
качестве аргумента функции, которая не гарантирует ее неизменности. Рассмотрим простой пример с
константной целой переменной.
const int j = 17;
// Целая константа
j = 29;
// Нельзя, значение не должно меняться
const int i;
// Нельзя, отсутствует начальное значение
Третья строка неверна, поскольку в ней компилятору предлагается определить случайную переменную,
которую никогда не удастся изменить, — этакий странный генератор случайных целых констант.
Вообще говоря, вы сообщаете компилятору, какой конструктор он должен использовать в конкретном
случае. Если бы переменная
i
относилась к нетривиальному классу, то при объявлении константного
экземпляра пришлось бы явно указать конструктор и его аргументы.
int
— вырожденный случай,
поскольку на самом деле
const int j=17;
— то же, что и
int j(17)
.
Но вот компилятор узнал, что нечто должно быть константным. Он просыпается и начинает искать
ошибки — не только фактические, но и потенциальные. Компилятор не разрешит использовать ваше
константное нечто в
любом неконстантном контексте, даже если шестилетний ребенок разберется в
программе и докажет, что в ней нет ни одной ошибки.
const i = 17;
int& j = 1;
// Нельзя, потому что позднее j может измениться
Do'stlaringiz bilan baham: