1.7 – Ключевые слова и именование идентификаторов в C++
Ключевые слова
C++ резервирует набор из 92 слов (по состоянию на C++20) для собственного использования. Эти слова называются ключевыми словами (keywords, или зарезервированными словами), и каждое из этих ключевых слов имеет в языке C++ особое значение.
Ниже приведен список всех ключевых слов C++ (до C++20):
alignas | int |
Ключевые слова, отмеченные (C++20), были добавлены в C++20. Если ваш компилятор не совместим с C++20 (или имеет функциональные возможности C++20, но по умолчанию они отключены), эти ключевые слова могут не работать.
C++ также определяет специальные идентификаторы: override
, final
, import
и module
. Они имеют особое значение при использовании в определенных контекстах, но не зарезервированы.
Вы уже встречали некоторые из этих ключевых слов, включая int
и return
. Эти ключевые слова и специальные идентификаторы вместе с набором операторов определяют весь язык C++ (за исключением команд препроцессора). Поскольку ключевые слова и специальные идентификаторы имеют особое значение, ваши IDE, скорее всего, изменят цвет текста этих слов (часто на синий), чтобы выделить их среди других идентификаторов.
К тому времени, когда вы пройдете эту серию обучающих статей, вы поймете, что делают почти все эти слова!
Правила именования идентификаторов
Напоминаем, что имя переменной (или функции, типа или другого типа элемента) называется идентификатором. C++ дает вам большую гибкость для именования идентификаторов по вашему желанию. Однако есть несколько правил, которые при именовании идентификаторов необходимо соблюдать:
- идентификатор не может быть ключевым словом (ключевые слова зарезервированы);
- идентификатор может состоять только из букв (нижнего или верхнего регистра), цифр и символов подчеркивания. Это означает, что имя не может содержать другие символы (кроме подчеркивания) или пробельные символы (пробелы или табуляции);
- идентификатор должен начинаться с буквы (нижний или верхний регистр) или символа подчеркивания, он не может начинаться с цифры;
- C++ чувствителен к регистру и, таким образом, различает строчные и прописные буквы (
nvalue
отличается отnValue
и отNVALUE
).
Лучшие практики именования идентификаторов
Теперь, когда вы знаете, как можно называть переменные, давайте поговорим о том, как желательно называть переменные (или функции).
Во-первых, в C++ принято, что имена переменных должны начинаться со строчной буквы. Если имя переменной состоит из одного слова, следует писать его строчными буквами полностью.
int value; // правильно
int Value; // неправильно (должно начинаться со строчной буквы)
int VALUE; // неправильно (должно начинаться со строчной буквы)
int VaLuE; // неправильно (обратитесь к психиатру);)
Чаще всего имена функций также начинаются со строчной буквы (хотя по этому поводу есть некоторые разногласия). Мы будем следовать этому соглашению, поскольку функция main
(которая должна быть во всех программах) начинается со строчной буквы, как и все функции в стандартной библиотеке C++.
Имена идентификаторов, начинающиеся с заглавной буквы, обычно используются для определяемых пользователем типов (таких как структуры, классы и перечисления, о которых мы поговорим позже).
Если имя переменной или функции состоит из нескольких слов, существует два распространенных соглашения: разделение слов подчеркиванием (называемое snake_case, «змеиная нотация») и написание последующих слов с заглавной буквы (называемое camelCase, «верблюжья нотация», поскольку заглавные буквы выступают, как горбы на верблюде).
int my_variable_name; // правильно (разделены подчеркиванием / snake_case)
int my_function_name(); // правильно (разделены подчеркиванием / snake_case)
int myVariableName; // правильно (с заглавными буквами / CamelCase)
int myFunctionName(); // правильно (с заглавными буквами / CamelCase)
int my variable name; // неправильно (пробелы не допускаются)
int my function name(); // неправильно (пробелы не допускаются)
int MyVariableName; // допустимо, но неправильно (должно начинаться со строчной буквы)
int MyFunctionName(); // допустимо, но неправильно (должно начинаться со строчной буквы)
В этом руководстве мы обычно будем использовать верблюжью нотацию потому, что ее легче читать (подчеркивание проще ошибочно принять за пробел в плотных блоках кода). Но часто можно увидеть и то, и другое – стандартная библиотека C++ использует подход с подчеркиваниями как для переменных, так и для функций. Иногда вы можете увидеть сочетание двух подходов: подчеркивания, используемые для переменных, и заглавные буквы, используемые для функций.
Стоит отметить, что если вы работаете с чужим кодом, обычно считается, что лучше соответствовать стилю кода, в котором работаете, чем строго следовать соглашениям об именах, изложенным выше.
Лучшая практика
При работе с существующим кодом программы используйте соглашения об именовании этой программы (даже если они не соответствуют передовым современным методам). При написании новых программ используйте передовой опыт.
Во-вторых, вам следует избегать именования идентификаторов, начинающихся с подчеркивания, поскольку эти имена обычно зарезервированы для использования ОС, библиотек и/или компилятора.
В-третьих, ваши идентификаторы должны четко указывать, что означает значение, которое они содержат (особенно, если единицы не очевидны). Идентификаторы должны быть названы таким образом, чтобы помочь тем, кто не имеет представления о вашем коде, понять его как можно быстрее. Через 3 месяца, когда вы снова посмотрите на исходный код своей же программы, и уже забыли, как она работает, вы поблагодарите себя за то, что выбрали осмысленные имена переменных.
Однако присвоение тривиальной переменной слишком сложного имени затрудняет общее понимание того, что делает программа, почти так же, как присвоение неадекватного имени широко используемому идентификатору. Поэтому хорошее практическое правило – делать длину идентификатора пропорциональной тому, насколько широко он используется. Идентификатор с тривиальным использованием может иметь короткое имя (например, такое как i
). Идентификатор, который используется более широко (например, функция, которая вызывается из разных мест в программе), должен иметь более длинное и описательное имя (например, вместо open
попробуйте openFileOnDisk
).
int ccount | Плохо | Что означает c перед «count»? |
int customerCount | Хорошо | Понятно, что мы считаем. |
int i | Одно из двух | Хорошо, если использование тривиально, в противном случае – плохо. |
int index | Одно из двух | Хорошо, если очевидно, что мы индексируем. |
int totalScore | Одно из двух | Хорошо, если оценивается только одна вещь, иначе слишком неоднозначно. |
int _count | Плохо | Не начинайте имена с подчеркивания. |
int count | Одно из двух | Хорошо, если очевидно, что мы считаем. |
int data | Плохо | Какие данные? |
int time | Плохо | Это в секундах, минутах или часах? |
int minutesElapsed | Хорошо | Описательное имя. |
int value1, value2 | Одно из двух | Трудно различить эти две переменные. |
int numApples | Хорошо | Описательное имя. |
int monstersKilled | Хорошо | Описательное имя. |
int x, y | Одно из двух | Хорошо, если использование тривиально, в противном случае – плохо. |
В любом случае избегайте сокращений. Хотя они сокращают время, необходимое для написания кода, они затрудняют чтение кода. Даже если сокращение однозначно, читателю нужно время, чтобы понять, что вы имели в виду. Код читается чаще, чем пишется, время, которое вы сэкономили при написании кода, – это время, которое каждый читатель, включая вас в будущем, потратит на его чтение. Если вы хотите писать код быстрее, воспользуйтесь функцией автодополнения в редакторе.
Наконец, большое значение может иметь уточняющий комментарий. Например, предположим, что мы объявили переменную с именем numberOfChars
, которая должна хранить количество символов во фрагменте текста. Текст «Hello World!» содержит 10, 11 или 12 символов? Это зависит от того, учитываем ли мы пробелы и знаки препинания. Вместо того чтобы называть переменную numberOfCharsIncludingWhitespaceAndPunctuation
, что довольно длинно, правильно размещенный комментарий в строке объявления должен помочь пользователю понять, что это:
// содержит количество символов в тексте, включая пробелы и знаки препинания!
int numberOfChars;
Небольшой тест
Вопрос 1
В зависимости от того, как вы хотели бы назвать переменную, укажите, является ли имя каждой переменной правильным (следует соглашению), неправильным (не соответствует соглашению) или недопустимым (не будет компилироваться) и почему.
int sum; // предположим, что мы подводим итоги
Ответ
Правильно.
int _apples;
Ответ
Неправильно – имена переменных не должны начинаться с подчеркивания.
int VALUE;
Ответ
Неправильно - имена переменных должны начинаться со строчной буквы.
int my variable name;
Ответ
Недопустимо – имена переменных не могут содержать пробелов.
int TotalCustomers;
Ответ
Неправильно – имена переменных должны начинаться со строчной буквы.
int void;
Ответ
Недопустимо – void
– это ключевое слово.
int numFruit;
Ответ
Правильно.
int 3some;
Ответ
Недопустимо – имена переменных не могут начинаться с цифры.
int meter_of_pipe;
Ответ
Правильно.