Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 27
Текст из файла (страница 27)
То есть сущности, на которые онн ссылаются, должны быть определены где-то в другом месте. Код (тело) функции кдг1 должен быть задан каким-то друшгм объявлением, память для целой переменной еггог питЬег выделяется некоторым другим объявлением еггог питЬег, и какое-то другое объявление типа (?кег должно определить как выглядит этот тип. Например: г?ои61е кдгг (г!оиЫе с!) ( >>« ..
«>>) пи еггог питбег=1; к1гис1 (?кег( >г« ... ">>), В программе на С«е для каждого имени должно быть ровно одно опрелеленпе (о действии директивы гг!ггс1иг?е сы. в 9 9.2.3). Объявлений же может быть несколько. Все объявления некой сущности должны согласовываться по типу этой сущности. По- мому следующий фрагмент содержит две ошибки: ш1 соил 1; ш1 соип1; >>>> ошибка: повторное определен>ге ех1егп иг1 еггог пигпЬег; ех1егп кбоггег ог питбег; П г>шггбкп> несоотвеипвие >палов Следующий фрагмент кода не содержит ошибок (об использовании ех?егп см, в Ь' 9.2): ех1егп ш1 еггог пигп бег, ех1епг т1 еггог пит бег; Некоторые определения указывают «значенгге» определяемой сущности. Например: <1гис1 Ра 1е ( ш1 с(, т, гг; ); 1урес?еусотр!ех<кбогг> Рош1 Глава 4. Типы и объявления 118 1лсаау [Ра1е' р] 1 ге1игп р — >Й, ) сопя! «1ои51е рг= 3 14158255358УТУ32385, Для типов, шаблонов, функций и констан~ «значение» является постоянным.
Для неконстантных типов данных начальное значение может быть позднее изменено. Например: ио1«1,Г[1 ( иы соип1 = 1, сопИ сйаг" пате = "В)агав", О пате является переменной, 0 указиваюгцей но ьонстанту (3 5 4.1) соип1= 3, пате = "Маг1ап", В приведенных в самом начале раздела определениях только в двух случаях сйагел, згггпуз, нс указаны значения. Объяснения по поводу того, как и когда переменной присваи- вается значение по умолчанию, см.
в ~ 4.9.5 и 9 10А.2, Любое объявление, в котором задается значение, является определением. 4.9.1. Структура объявления Объявление состоит из четырех частей; необязательного спецификатора, базового гнпа, объявляющей части и, возможно, иннцналпзатора За исключением определе- ний функций н пространств ил]ен объявление заканчивается точкой с запятой На- пример: сйаг* 51луз[] =1 "Антигон', 'Селввк', "Птолемей" ), В этом примере базовым типом является сйаг, объявляющей частью -. 'Йлдз[], а пницпализатором — = [: ] В качестве спецпфпкаторов могу~ выступать ключевые слова, такие как и1г1иа1 Я 2.5.5, 9 12.2.6) и ех1егл Я 9.2). Они приводятся в начале объявления и описывают характеристики, не связанные с типом.
Объявляющая часть состоит из имени и, возможно, операторов об ьявленпя Наиболее часто встречаются следующие операторы обьявления Я А.7.1); *солИ Их использование значительно упростилось бы, будь они все либо префиксами, либо суффиксами. Однако, *, [] и [] разрабатывались так, чтобы отражать их смысл в выражениях Я 6.2). Таким образом, * является префиксом, а [] и [] — суффиксами. Суффпксные операторы объявления «крепче связаны> с именем, чем префиксные.
Следовательно, 'Ылдз[] означает массив указателей на какие-либо объекты, а для определения указателе констинтный указатель ссылка массив функция префикс префикс префикс суффикс суффикс 119 4.9. Объявления типов наподобие «указатель на функцию», необходимо использовать скобки (см. примерь| в 9 5.1). Детали см. в приложении А, где описана грамматика, Обратите внимание; тип должен присутствовать в ооъявлении. Например: сопя! с = 7; //ошибка: не указин тип 01йп1а, т1 Ь)!ге!ига)а>Ь)? а.Ь;) //ошибка: не указан тип // в озер ащиелого значения // правильно — нпзгупеа явяяется 0 сокращением иппупес) тг // правильно — !опу является типов !опд т1 ипя!дпед и1; !опд УЬ Стандарт С++ отличается от ранних версий С и С++, в которых первые два объявления допустимы.
Если тип не указывался, по умолчанию подразулгевался !гл! Я Б.2). Это правило «неявного !п1» было источником петривиалы|ых ошибок и недоразумений. 4.9.2. Объявление нескольких имен Разрешается объявлять несколько имен в одном операторе объявления. Объявление просто содержит список объявителей, разделенных запятыми. Например, мы можем объявить две целые переменные следуюлцим образом: !п1х,у; //1п1х; тгу; Обратите внимание, что операторы объявления применяются только к ближайшему имени и не относятся к соседним именам в объявлении. Например: // 1п1' р; сп1 у; !11Е т!' у,) //1п1х, т1" у; //тго/10/, т1* ро; !пг*р, у; !п1х, 'д, !пса)10), "ро; Такие конструкции делают программу менее читабельной, и их следует избегать. 4.9.3. Имена Йе!!о 1«ЕР1ИЕЕЗ оагб 1Ь!я 1я а гпон ипияиа!!у 1опу пате /оО ЬЛг и пате Ногяе5епяе оаг1 С1А55 с1аяя Примеры последовательностей символов, которые нельзя использовать в качестве идентификаторов; 012 а/оо! 3яуя с!аяя Зоаг рау с1ие 1оо-Ьаг пате Ц Имя ! идентификатор) состоит из последовательности букв и цифр.
Первым символом должна быть буква. Символ подчеркивания считается буквой. В С++ нет ограничений на количество символов в имени. Однако некоторые части реализации!в частности, компоновщик) недоступны автору компилятора и онн, к сожалению, иногда накладывают такие ограничения. Некоторые среды пополнения иногда требуют расширить или ограничить набор символов, допустимых в идентификаторе. Расширения (наприлчер, использование символа 3 в имени) часто приводят к непереносимым программам. Ключевые слова С+ (приложение А), такие как пеш или !п1, нельзя использовать в качестве имени сущности, определяемой пользователем. Примеры имен: 120 Глава 4.
Типы и объявления Имена, на*пшаюшпеся с символа подчеркивания, зарезервпрованы для специфических нужд реалпззцш~ н среды исполнения, поэтому такие имена не следует использовать в прикладных программах. Прп считывании программы компилятор всегда ищет наибольшую строку символов, которая может госта вить имя. Поэтому паг10 является одним именем, а не именем айаг, за которым следует число 10. Также и е1зе(1 является одним именем, а не ключевым словом е1зе, за которым следует ключевое слово (1: Символы в верхнем и нижнем регистре различаются, поэтому Соил( и сопл( — разные имена. Не слишком разумно выбирать имена, различающиеся только регистром.
В целом лучше избегаю имен, которые внешне отличаются незначительна. Например, заглавную о (0) и ноль (О) трудно отличить друг от друга. То же самое можно сказать о прописной букве В (1) и цифре 1 (единица). Следовательно, 10, 1Р, П и Д— неудачные имена. Имена с болыпой областью видимосги должны быль относительно подробными и осмысленными. Например, такими: иес1аг(вектор), 1г7пдош ш11Ь Ьогг(ег(окно с рамкой) нлп Рераг1гпеп1 пигпЬег (номер отдела), Напротив, код выглядит чище, если переменныс с небольшои областью видимости имеют короткие привычные имена, такие как х,( и р.
Для того пабы ограничить область видимости, можно пользоваться классами (глава 10) и прострапствагии имен (з 8.2). Полезно делать часто используемые имена короткими, а длинные оставлять для редко используемых имен. Выбирайте имена, исходя из смысла объекта, а не его представления. Например, рйопе Ьооп (телефонная книга) предпочтительнее, чем пигпбег Йз1(список номеров), хотя телефонные номера вероятна будут храниться в списке (11з1) Я 3.7). Выбор хороших имен является искусством. Пьпайтесь последовательно придерживаться определенного стиля прп выборе пмеп.
Например, начинайте имена типов, определяемых пользователем, из нестандартных библиотек с заглавной буквы, а имена не типов — с прописной (напрпмер, ВЬаре и спггеп1 1ойеп). Макросы записывайте заглавными буквами (если непременно нужен макрос; пшпите, например, НАСК) и пользуйтесь знакам подчеркивания для отделения слов в идентификаторе. И все-таки сложно последовательно придерживаться какогота одного стиля, так как обычно программы состоят из несколъкнх фрагментов, взятых из разных источи шсов; каждый из них может использова~ь свои собственный разуьшый стиль Будьте последовательны при выборе сокращений и составных имен.
4.9.4. Область видимости Объявление ввалпт имя в область видимости. Эта значит, чжз имя может использоватьсяя только в определенной части ~скота программы. Для имени, объявленного в теле функции (такое нмя часто называют локпльлььи), область видимости начинается с места объявления имени и заканчиваемся в канне блока, в котором это имя объявлено. Блоком называется фрагмент текста, заключенный в фигурные скобки ( ). Имя называется глабальныхц если оно объявлено вне любой функции, класса (глава 10) илп пространства имен Ц 8.2). Обласкав видимое~и глобальных имен простирается от места их обьявления до конца файла, содержащего объявление, Обьявленпе имени в блоке может скрыть обьявление этого имени в охватывающем блоке илп глобальное имя.
То есть имя может быть замещено внутри блока и будет ссылаться там на другую сущность. После выхода пз блока нмя восстанавливает свой прежний смысл. Например: 4.9. Объявления //елобальнпя переменная х 1п1 х; иоЫД ( 1п1х; //локальная пере пенная х скрывает // етбальную переменную х //присваиваниелокальной переменной х // кскри вость первую л окп чья ую переменную х // при 'вливание второи локальнои переменнои х 1пгх, х =-2, ) х=З, //присвпивпнпе первонлокильной переменной х 0 взять адрес аюбильной переменной х )пав р = ох; Ы1х, ооЫ/2 () ( // глобальная переменная х скрыта 0 присвшшпние елооаль ной переложенной х /1 прьтпанванпе локальной переменной х сп1х = 1, к=2; х=2; с Не существуьч способа обращения к скрытой локальной переменной.
Область видимости имени начинается в точке объявления, точнее, сразу после объявителя, но перед инициализатором. Поэтому допускается использование имени в качестве инициализирующего значения для себя самого. Например: ооЫ/2 () 1пг х = х, //торопно: присваиваем переменной х ее собопвенное // (неини рализированное) значение Ото допустимо, но неразумно. Хороший компилятор выдаст предупреждение в слу~ае использования переменной до того, как она будет инициализирована 19 5.9[9().