Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 165
Текст из файла (страница 165)
Функции в определении класса при- сваивается атрибут ю г1на1, как в следующем примере: чтгтча1 чотб зетча1ое(тпт *а, тпт Ы: Если функция эе1ча1ее переопределяется в производном классе, то при каждом использовании имени зегча1ие для объекта производного класса будет использо- ваться последнее определение функции. Если определение класса должно использоваться только в качестве базового класса, а все объекты данных определяются в производных классах, то такис клас- сы называются абстрактными, Абстрактный класс можно определить как класс, содержащий чисто виртуальную функцию: чтгтча1 чо(д зетча1ое(тпт *а, тпт Ы 0: Ни олин экземпляр класса, содержащего чисто виртуальную функцию, не мо- жет быть объявлен.
Производный класс, содержащий чисто виртуальную функ- цию, должен переопределить ее, если он будет использоваться для создания объек- тов этого производного класса. Шаблоны. В языке С--ч- существует форма общей функции, называемая шаб- лоном. Синтаксис шаблона следующий: Севр1ате <с1азз паранетр типа> с1азз иня класса определение где определение — это либо определение класса, либо определение функции.
Шаблон ння класса<фактический тип> используется для описания объявления класса. Например, 1 йтпс1ыбе <зтгеаи П> 2 теир1ате <с1авв зтасхтуре, тпт ю ге> с1ава а11зтасх 3 ( рыЫ тс: зтасхтуре зто(з(те]: ] ; 4 а11зтасй«пц10> х; 5 411зтасх<ттоац20> у; 6 идтп() 598 Приложение. Обзоры языков 7 [х.вс9(41 = 7.5, 7/ целочислеиний пассив 5 у вор[4] - 7.5; 7/ вевес~вениий массив 9 соиС « х.4[9[41 « ' ' « у 4[9[41 « епб1: ) В строках 2-3 создается шаблон класса с именем а115(асК, у которого имеется параметр типа всасКСуре и целый параметр 5! 7Е.
Этот шаблон отводит память под дашгыс массива с именем в(9, размер которого равен в! Се, а тип — вСасКСуре. В строках 4-5 создается объект х класса 4115СасК, внутрсннсс представление которого— это целочисленный массив из 1О элементов, и объект у класса 4115(асК, представленный вещественным массивом из 20 элементов. В результате трансляции и выполнения этой программы получаем следующий вывод. Сообщения компилятора об ошибках'. ваир1е.сс !п гипс!сои П пС па!и [1' вапр1е.сс 7 нагп1по; [1оаС ог боише аввщпеб Со спсеоег баса Суое $ ехесисе 7 7.5 Предупреждение означает, что вещественное число 7.
5 было преобразовано к целому числу при его присваивании переменной х. 559[4), а при присваивании переменной у 5(9[41 опо оставалось всп[дственнгям. Представление объектов в памяти Объекты класса могут быть представлены в памяти так жс, как и объекты структуры 5СгисС. Вызов метода с1аввоЬ)есС.!пеСПобпалсе[параиетр) на самом деле транслируется в процессе компиляции в следующую запись: с!аввпаве: иеснобпаие[ас!аввообесС. паоането) Единственная сложность возникает, когда вызыва!отея виртуальныс функции, поскольку реальная функция, которую необходимо вызвать, может быть переопределена в производном классе. Лля разрешения этой проблемы необходимо только сохранить таблицу переходов в объекте класса для каждой наследуемой виртуальной функции.
Если опа обновляется для каждой новой виртуальной функции в производном классе, то этот обьскт данных всегда будет указывать па текущую виртуальную функцию, которую необходимо вызвать. П.3.2. Управление последовательностью действий Язык С++ содержит тс жс операторы, что и язык С. В С++ добавлена обработка исключительпь!х ситуаций, хотя пс каждый транслятор С++ обеспечивает зту возможность. Выражения Выражения языка С++ те же, что и в язьгкс С. Эти сообшсния появится при использовании комииля гора Сел в гигтемс!7Х!Х, ири непале~овации лругиго копнили гора С г К ~ми ример фирмы Миговой пля системм Свг1 обоих, их ис булст — Причеч. кауч. ред.
Операторы Все операторы языка С можно использовать в языке С-ь+. Параметры функций по умолчанию. Параметры функций могут иметь значения по умолчанию, которые задаются их простой инициализацией в определениях функций. Например, функция щутцпсыоп (тпт а; тпт ь - /): может быть вызвана как ву/цпсс) оп(5, 12), при этом значения переменных будут а = 5иЬ = 12;иликакву/цпсстоп(б),тогдазначенияпеременныхбудут:а 6,Ь - У. Параметры перечисляются в таком порядке, чтобы параметры, имеющие значения по умолчанию, располагались справа.
(Заметим, что эта конструкция потенциально опасна, особенно если программа содержит имена перегруженных функций с различными списками параметров. Во избежание осложнений следует избегать данного способа вызова функций.) Оператор сгу. Оператор тгу используется для обработки программно-определенных исключительных ситуаций: тту ( оператор,; оператор,: (Г условие искпючения(титан иня искпючения). ) сатси(иня исключения)( // Обработка иснлючитепьной ситуации ) // конец искпючитепьнои ситуации Внутри любой процедуры, содержащей блок ггу, генерирование исключения оператором 1Ьгоы приводит к выполнению соответствующего оператора са ьсЬ. После этого процедура завершается. Операторы са(сЬ (которые являются определениями перегруженной функции) проверяются по очереди, пока не будет обнаружено совпадение с соответствующим оператором 1Ьгоы.
Например, тцгоы "Зто данные с оюибкаии." может быть выявлен следующим обработчиком: са(сц (сваг "Е гог5(гтпр) ( / *Обработка искпючения */ ) Ввод и вывод Входные и выходные потоки определены как стандартный набор функций. Функции соцс и с1 и и родственные нм функции описаны в следующем разделе. Перегрузка.
В языке С++ две функции могут быть перегруженными (то есть иметь одно и то же имя), если они имеют различные сигнатуры. Например, тпт Му(нос(топ(тпт а, тпт Ь) (. .). // Функция А тп( Му(нос(топ(тпт а) (...); // Функция В представляют две различные функции А и В. Если в программе дважды определено имя функции, С++ делает следующее. 1.
Если сигнатуры полностью совпадают, вторая функция будет восприниматьсяся как переопределение первой. 600 Приложение, Обзоры языков 2. Если аргументы совпадают, а возврашаемые значения нет, то вторая функция воспринимается как ошибка. 3. Если аргументы нс совпадают, функции рассматриваются как перегруженные. Символы операций также могут быть перегружень( в определении класса путем определения функции, начинаюп(ейся со слова орега1ог, за которым следует перегруженный символ. Например, функция + для возврата первого символа строки может быть определена следующим образом; ()дпс)пае хд(геап П> с1а55 гклпд (риЫ (с. спдг орегатог+О (гегогп 5(9[0]:): спдг 559[4].
): еа1п() (Глдпд х: х.559="апс"; соШ « "ршпг х[0], " -х « еп01:) где первый аргумент — экземпляр класса ГЬ) пд. Данная программа осуществит следую(ций вывод: рг1п( х[0]; а Бинарный вариант операции сраг для + будет иметь сигнатуру сваг орегагог+((Шпд дтшпд) ... и к компонентам второго аргумента можно обращаться как 5гг( пд. 559. К первому аргументу можно обращаться как Ь))) 5 -а 559. Сигнатура перегруженных операций должна быть совместима с сигнатурой их стандартных функциональных возможностей. Таким образом, + может быть унарным или бинарным, но!, например, может быть только унарным. Перегруженная операция,такая как [Шпд ба[а + )п5 Ьата,должнабытьопределена внутри класса ГЬ)пд 0а[а как функция с аргументом ) п( ба[а.
Таким образом, левый аргумент бинарной операции определяет класс, который содержит определение функции. В приведенном примере класс [Ь) пд содержит функцию орегагог+ ((пг х)(...) чтобы написать функцию дп[ ()ага -[ь) пд 0ага, необходимо иметь функцию, в которую передается ар(умент класса ЬЬдпд, примененный к классу )п~. Однако тип ) пЬ является встроенным. Эту проблему можно решить, если определить функцию как дружественный класс ((г)еп()) в определении класса ььдпд: Ггдепп орегаъьг+ (апг х, гшпд у)(...) Однако в любом случае по крайней мере один аргумент у операции + должен быть из класса, определенного пользователем.
Неявные преобразования. Конструкция орегагог может быть использована для неявного преобразования типов. Пусть у нас задан объект класса 5Ь1 пд. Конструкция драга(ог гураО ( ге[игл ... ) будет вызываться всегда, когда используется объект класса ФЬ1пд, а требуется объект типа Ьуре.
Если добавить в опрелеление класса гь) пд следующую строку: прага(пг сваг() ( ге(пгп 559[0] ) то следующая функция будет иметь такое же действие, что и предыдущая перегруженная операция ь: па1п() (Гпдпд х х 559 - "аЬс" соШ "рюп( х[0]: " «(спаг) х «еп01,) П.4. ЕОРТРА[ч' 601 Стандартные функции Все функции языка С можно использовать в языке С+-Р. Кроме того, язык С++ содержит набор стандартных потоковых функций ввода-вывода, определенных в заголовочном файле Игеаш.П. Функция сои6 «)Ееа добавляет элемент )Ееи(в выходной поток. В одном операторе можно добавить несколько элементов, например, сооТ «Хбеи[, «)Те(А, Для добавления символа окончания строки и печати этой строки используется специальный элемент еп01.
Функция соОЕ.роЕ поместит аргумент, состоящий из одного символа, в выходной поток. Функция с[п считывает данные в свободном формате. с[п» а» Ь считывает первый элемент в переменную а, а второй в переменную Ь. Если требуется считать одиночный символ, это действие произведет функция с) п. деЕ (функция деЕ аналогична функции деЕОПаг из файла И([[о. П). Функция деТ[1пе( сПаг *Ь, )пт Ьзтге, сПаг Ое1ив = 'Хп') считываетблокиз не более чем Ьюхе-1 символов, сохраняет его в массиве Ь и добавляет в конец пиП- символ ХО.
Параметр пе[[А( определяет, какой последний символ считывать (обычно это символ конца строки Хп). Распределение памяти. Для распределения памяти в языке С++ нет необходимости использовать системную функцию пи11ос. В этот язык были добавлены функции пен и Ое! ете. Функция пеи иии типа размещает в памяти объект указанного типа и возвращает указатель на него. При вызове пеи иии класса объект указанного класса размещается в памяти и возвра(цается указатель на него.