Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Не используйте слишком длинные имена; их трудно набирать, они занимают много места и плохо читаются. Приведем удачные, на наш взгляд, варианты:
partial_sum
element_count
stable_partition
А вот следующие имена нам кажутся слишком длинными:
the_number_of_elements
remaining_free_slots_in_symbol_table
Мы предпочитаем использовать в качестве разделителей слов в идентификаторе символы подчеркивания, например element_count, а не elementCount или Element-Count. Мы никогда не используем имена, состоящие лишь из прописных букв, такие как ALL_CAPITAL_LETTERS, поскольку по умолчанию они зарезервированы для макросов (см. разделы 27.8 и A.17.2), которых мы избегаем. Мы используем прописные буквы в качестве первых букв в именах типов, например Square и Graph. В языке С++ и его стандартной библиотеке прописные буквы не используются, поэтому типы называются int и string, а не Int и String. Таким образом, принятое правило позволяет минимизировать вероятность конфликтов имен между пользовательскими и стандартными типами
Избегайте имен, в которых легко сделать опечатку или ошибку при чтении.
Рассмотрим пример.
Name names nameS
foo f00 fl
f1 fI fi
Символы 0, o, O, 1, l, I особенно часто порождают ошибки.
3.8. Типы и объекты
Понятие типа является основным в языке С++ и большинстве других языков программирования. Рассмотрим типы пристальнее и немного более строго. Особое внимание уделим типам объектов, в которых хранятся данные на этапе вычислений. Все это сэкономит нам время в ходе долгих вычислений и позволит избежать некоторых недоразумений.
• Тип — определяет набор возможных значений и операций, выполняемых над объектом.
• Объект — участок памяти, в котором хранится значение определенного типа.
• Значение — набор битов в памяти, интерпретируемый в соответствии с типом.
• Переменная — именованный объект.
• Объявление — инструкция, приписывающая объекту определенное имя.
• Определение — объявление, выделяющее память для объекта.
Неформально объект можно представить в виде ящика, в который можно положить значения определенного типа. В ящике для объектов типа int можно хранить только целые числа, например 7, 42 и –399. В ящике для объектов типа string можно хранить символьные строки, например "Interoperability", "tokens: @#$%^&*" и "Old MacDonald had a farm". Графически это можно представить так:
Представление объекта типа string немного сложнее, чем объекта типа int, так как тип string хранит количество символов в строке. Обратите внимание на то, что объект типа double хранит число, а объект типа string — символы. Например, переменная x содержит число 1.2, а переменная s2 — три символа: '1', '.' и '2'. Кавычки вокруг символа и строковых литералов в переменных не хранятся.
Все переменные типа int имеют одинаковый размер; иначе говоря, для каждой переменной типа int компилятор выделяет одинаковое количество памяти. В типичном настольном компьютере этот объем равен 4 байтам (32 бита). Аналогично, объекты типов bool, char и double имеют фиксированный размер. В настольном компьютере переменные типа bool и char, как правило, занимают один байт (8 бит), а переменная типа double — 8 байт. Обратите внимание на то, что разные типы объектов занимают разное количество памяти в компьютере. В частности, переменная типа char занимает меньше памяти, чем переменная типа int, а переменная типа string отличается от переменных типов double, int и char тем, что разные строки занимают разное количество памяти.
Смысл битов, размещенных в памяти, полностью зависит от типа, используемого для доступа к этим битам. Это следует понимать следующим образом: память компьютера ничего не знает о типах; это просто память, и больше ничего. Биты, расположенные в этой памяти, приобретают смысл, только когда мы решаем, как интерпретировать данный участок памяти. Такая ситуация вполне типична при повседневном использовании чисел. Что значит 12.5? Мы не знаем. Это может быть 12.5 долл., 12.5 см или 12.5 галлонов. Только после того, как мы припишем числу 12.5 единицу измерения, оно приобретет конкретный смысл. Например, один и тот же набор битов в памяти может представлять число 120, если его интерпретировать как переменную типа int, и символ 'x', если трактовать его как объект типа char. Если взглянуть на него как на объект типа string, то он вообще потеряет смысл и попытка его использовать приведет к ошибке, возникшей в ходе выполнения программы. Эту ситуацию можно проиллюстрировать следующим образом (здесь 1 и 0 означают значения битов в памяти).
Этот набор битов, записанных в участке памяти (слове), можно прочитать как переменную типа int (120) или char ('x'), если учитывать только младшие биты. Бит — это единица памяти компьютера, которая может хранить либо 0, либо 1.
Смысл двоичных чисел описан в разделе А.2.1.1.
3.9. Типовая безопасность
Каждый объект в ходе определения получает тип. Программа — или часть программы — является безопасной с точки зрения использования типов (type-safe), если объекты используются только в соответствии с правилами, предусмотренными для их типов. К сожалению, существуют операции, которые не являются безопасными с этой точки зрения. Например, использование переменной до ее инициализации не считается безопасным.
int main()
{
double x; // мы забыли проинициализировать переменную х:
// ее значение не определено
double y = x; // значение переменной y не определено
double z = 2.0+x; // смысл операции + и значение переменной z
// не определены
}
Компьютер может даже сообщить об ошибке аппаратного обеспечения при попытке использовать неинициализированную переменную х. Всегда инициализируйте свои переменные! У этого правила есть лишь несколько — очень немного — исключений, например, если переменная немедленно используется для ввода данных. И все же инициализация переменных — это хорошая привычка, предотвращающая множество неприятностей. Полная типовая безопасность является идеалом и, следовательно, общим правилом для всех