Г. Шилтд - Самоучитель C++ (DJVU), страница 7
Описание файла
DJVU-файл из архива "Г. Шилтд - Самоучитель C++ (DJVU)", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 7 - страница
3. Создайте класс с циклической очередью целых. Сделайте очередь длиной 100 целых. В функцию ша!и() включите краткую демонстрацию ее работы. 1.6. Некоторые отличия языков С и С++ У языка С++ есть ряд небольших отличий от С. Хотя каждое из этих отличий само по себе незначительно, вместе они достаточно распространены в программах С++. Поэтому перед тем как двинуться дальше, обсудим эти отличия. а Во-первых, если в С функция не имеет параметров, ее прототип содержит слово гоЫ в списке параметров функции. Например, если в С функ- Глава Ь Краткий обзор С++ ция ПО не имеет параметров (и возвращает сЬаг), ее прототип будет выглядеть следующим образом: сваг г1 (чоЫ); В С++ слово гоЫ не обязательно.
Поэтому в С++ прототип обычно пишется так: сваг ~1(); С++ отличается от С способом задания пустого списка параметров. Если бы предыдущий прототип имел место в программе С, то это бы означало, что о параметрах функции сказать ничего нельзя. А в С++ это означает, что у функции нет параметров. Поэтому в предыдуших примерах для исчерпывающего обозначения пустого списка параметров слово гоИ не использовалось. (Использование АЖ для обозначения пустого списка параметров не ошибочно, скорее, оно излишне. Поскольку большинство программистов С++ гонятся за эффективностью с почти религиозным рвением, вы никогда не увидите гон) в таких случаях.) Запомните, в С++ следующие два объявления эквивалентны: 1пт Г1(); (п1 Г1 ['коъа); а Другим небольшим отличием между С и С++ является то, что в программах С++ все функции должны иметь прототипы.
Запомните. в С прототипы функций рекомендуются, но технически они не обязательны, а в С++ прототипы необходимы. Как показывают примеры из предыдущего раздела, содержащийся в классе прототип функции-члена действует так же, как ее обычный прототип, и никакого иного прототипа не требуется. ы Третьим отличием между С и С++ является то, что если в С++ функция имеет отличный от АЖ тип возвращаемого значения, то инструкция ге1игп внутри этой функции должна содержать значение данного типа.
В языке С функции с отличным от чоЫ типом возвращаемого значения фактически не требуется возвращать что-либо. Если значения нет, то функция возвращает неопределенное значение. В С, если тип возвращаемого функцией значения явно не задан, функция по умолчанию возвращает значение целого типа. В С++ такого правила нет. Следовательно, необходимо явно объявлять тип возвращаемого значения всех функций. а Следующим отличием между С и С++ является то, что в программах С++ вы можете выбирать место для обьявления локальных переменных. В С локальные переменные могут объявляться только в начале блока, перед любой инструкцией "действия".
В С++ локальные переменные могут Самоучитель Сч-ь объявляться в любом месте программы. Одним из преимуществ такого гюдхода является то, что локальные переменные для предотвращения нежелательных побочных эффектов можно объявлять рядом с местом их первого использования. а И последнее. Для хранения значений булева типа (истина или ложь) в С++ определен тип данных Ьоо1. В С++ также определены ключевые слова !где и Ыве — единственные значения, которыми могут быть данные типа Ьоо!. В С++ результатом выполнения операторов отношения и логических операторов являются значения типа Ьоо1, и направление развития любой условной инструкции должно определяться относительно значения типа Ьоо!. Хотя такое отличие от С на первый взгляд кажется значительным, на самом деле это не так.
Фактически оно совершенно прозрачно и вот почему: как вы знаете, в С любое ненулевое значение является истинным, а нулевое — ложным. В С++ это положение сохраняется, поскольку при использовании таких значений в булевом выражении ненулевое значение автоматически преобразуется в !гве, а нулевое— в Га!ве. Правильно и обратное: !где преобразуется в 1, а Га!зе в О, если значение типа Ьоо1 оказывается в целом выражении. Добавление в С++ данных типа Ьоо1 усиливает контроль типа и дает возможность различать данные булева и целого типов.
Естественно, что использование данных булева типа не обязательно, скорее оно просто удобно. 1. В программах С, при отсутствии в командной строке аргументов, функция ваш О обычно объявляется так: 1пг гааз.п ~ тоггц Однако в С++ такое использование слова гоЫ избыточно и необязательно. 2. Эта короткая программа С++ не будет компилироваться, поскольку у функции яппи нет прототипа: // Эта программа не будет компилироваться Фьпс1пое <тоастеав> пьяпя пагпеврасе всс1т !пг гааьп (1 ( 1пт а,Ь,с; сопЬ « "Введите два числа: сл гт » а »Ь; с-аиа(а, Ь); сонг « "Суьача равна:" « с; обзор 35 С++ Глава Краткий гегцгп О; Этой Функции необходим прототип вша(1пп а, 1пс Ь) ( песптп а+Ь; ) 3.
Эта короткая программа иллюстрирует тот факт, что локальные переменные можно объявить в любом месте блока: Шпс1ис)е <1овсгеап~> ивтпд палеврасе в~с(; шг тайп ( ) 1пг 1; // локальная переменная, объявленная в начале блока сопл « "Введите число:"; сзп»з у // расчет Факториала 1пг 1', Йасс 1/ // переменные, объявленные перед инструкциями // действия тот ()=1' з>=1; з -- ) Йасс=Йасг * з г сопл « "Факториал равен:" « тасс; пес гп О; Хотя объявление переменных) и $ас1 рядом с местом их первого использования в этом коротком примере и не слишком впечатляет, в больших функциях такая возможность может обеспечить программе ясность и предотвратить нежелательные побочные эффекты.
4. В следующей Программе создается булева переменная ои1соте и ей присваи- вается значение Ыве. Затем эта переменная используется в инструкции 11. ()1пс1ис)е<(ов1геагп > ив)пя пашеврасе в1с); 1п1 тпаьп () Ьоот овбсоп~е; способе = Йа1ве; 11 (сиесте) сопс « "истина"; е1яе сопл « "ложь"; Самоучитель Зб гегцгп Ст Как и следовало ожидать, в результате выполнения программы на экране появляется слово ложь. ~е~~йвю Следующая программа не будет компилироваться в качестве программы С++. Почему? // В этой программе есть ошибка Ф1пс!цс(е <~оатхеат> цз1пя пагпезрасе зЫ; ии 1па'и () Г(); тетюш и О; чоЫ (!! соц! « "Программа работать не будет"; 2.
Попытайтесь объявлять локальные переменные в различных местах программы С++. Попытайтесь проделать то же с программой С, обращая внимание на то, какие объявления вызовут сообщения об ошибках. 1.7. Введение в перегрузку функций После классов, вероятно, следующей важной и необычной возможностью С++ является перегрузка функций ((ипсаоп огег!оагт(пф. Перегрузка функций не только обеспечивает механизм, посредством которого в С++ достигается один из типов полиморфизма, она также формирует то ядро, вокруг которого развивается вся среда программирования на С++.
Ввиду важности темы в данном разделе предлагается только предварительное знакомство с перегрузкой функций, которой посвящена целая глава этой книги. В С++ две или более функции могут иметь одно и то же имя, отличаясь либо типом, либо числом своих аргументов, либо и тем и другим. Если две или более функции; ', а,, лонаковос нмя, говорят, что они перегружены. 7. Краткий обзор с++ зу Глава Перегруженные функции позволяют упростить программы, допуская обращение к одному имени для выполнения близких по смыслу действий.
Перегрузить функцию очень легко: просто объявите и определите все требуемые варианты. Компилятор автоматически выберет правильный вариант вызова на основании числа и/или типа используемых в функции аргументов. ~фВ С++ можно также перегружать и операторы. Однако для того чтобы понять перегрузку операторов, необходимо больше узнать о С++. .-';Лримеры.-' ), Одно из основных применений перегрузки функций — это достижение полиморфизма при компиляции программ, который воплощает в себе философию — один интерфейс, множество методов. Как вы знаете, при программировании на С необходимо иметь определенное число близких по назначению функций, отличающихся только типом данных, с которыми они работают. Классический пример этой ситуации дает набор библиотечных функций С.
Как ранее упоминалось в этой главе, библиотека содержит функции аЬв(), !аЬ|0 и (аЬ|(), которые возвращают абсолютное значение, соответственно, целого, длинного целого и числа с плавающей точкой. Однако из-за того, что для трех типов данных требуется три типа функции, ситуация выглядит более сложной, чем это необходимо. Во всех трех случаях возвращается абсолютная величина числа, отличие только в типе данных. В то же время, программируя на С++, вы можете исправить эту ситуацию путем перегрузки одного имени для трех типов данных так, как показано в следующем примере: $1пс1ис(е <1овттеал~> ив1пя пагпеврасе вМ; // Перегрузка аЬв () тремя способами ! и( аЬв (1пс и); (опя аЬв(1опд п)г с(оиЫе аЬв (с(овЬ1е и) г (в( виьп ( ) соус « "Абсолютная величина -10;" « аЬз(-10) « "~п/п" т сощ « "Абсолютная величина -10ь:" « аьв(-10ь) « "~пУв" р соит « "Абсолютная величина -10,01:" « аЬа(-" 0.01) « "~пуп" р гстигп 0; Самоучитель /l аЬь () для целых тпрр аЬв (тпс п) ( соцп <с "В целом аЬв() ~п" т тесцтп п<0 ? -и: п; аЬв () для длинных целых 1опо аЬ| (1опд и,) сонь « "В длинном целом аЬв()хп"; юеептп п<0 ? -и: аЬв() для вецественных двойкой точкос и бовЬ1е аЬв («(оцЫе и) сопл « "В вежественном аЬв() двойной точности~и"; иеюптп п<О ? -п: Как можно заметить, в программе задано три функции аЬзО, своя для каждого типа данных.