1.7 – Ключевые слова и именование идентификаторов в C++

Добавлено 8 апреля 2021 в 20:14

Ключевые слова

C++ резервирует набор из 92 слов (по состоянию на C++20) для собственного использования. Эти слова называются ключевыми словами (keywords, или зарезервированными словами), и каждое из этих ключевых слов имеет в языке C++ особое значение.

Ниже приведен список всех ключевых слов C++ (до C++20):

alignas
alignof
and
and_eq
asm
auto
bitand
bitor
bool
break
case
catch
char
char8_t (начиная с C++20)
char16_t
char32_t
class
compl
concept (начиная с C++20)
const
consteval (начиная с C++20)
constexpr
constinit (начиная с C++20)
const_cast
continue
co_await (начиная с C++20)
co_return (начиная с C++20)
co_yield (начиная с C++20)
decltype
default
delete
do
double
dynamic_cast
else
enum
explicit
export
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
noexcept
not
not_eq
nullptr
operator
or
or_eq
private
protected
public
register
reinterpret_cast
requires (начиная с C++20)
return
short
signed
sizeof
static
static_assert
static_cast
struct
switch
template
this
thread_local
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
xor
xor_eq

Ключевые слова, отмеченные (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;

Правильно.

Теги

C++ / CppДля начинающихОбучениеПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.