Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
7
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

Заключение

Материал данного учебного пособия может существенно помочь в освоении языка С++, однако, лишь при условии интенсивной самостоятельной работы на ЭВМ непосредственно с компиляторами С++, исследовании системы помощи (Help), а также доступных для чтения заголовочных и исходных файлов. Существенную помощь способно оказать общение со специалистами в области программирования на С++ в рамках электронных конференций, имеющихся в сетях Интернет и ФИДО, изучение исходных текстов программ, размещенных на сайтах в сети Интернет. Тем, кто заинтересован в профессиональном овладении языком С++, целесообразна непосредственная работа с его стандартом [8].

Библиографический Список

  1. Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер. с англ. – М.: «Конкорд», 1992.

  2. Страуструп Б. Язык программирования С++. – ?

  3. Скляров В.А. Язык С++ и объектно-ориентированное программирование: Справочное пособие. – Минск: Выш. школа, 1997.

  4. Крячков А.В., Сухинина И.В., Томшин В.К. Программирование на С и С++: Практикум. – М.: «Горячая линия – Телеком», 2000.

  5. Мейерс С. Эффективное использование С++. – М.: ДМК, 2000.

  6. Мейерс С. Наиболее эффективное использование С++. – М.: ДМК, 2000.

  7. Страуструп Б. Дизайн и эволюция языка С++. – М.: ДМК, 2000.

  8. Programming Languages – C++. International Standard. – ISO/IEC 14882, 1998.

Зотов Игорь Валерьевич

Ширабакина Тамара Александровна

РАЗРАБОТКА ПРОГРАММ НА С++ ТЕОРИЯ, ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ, ЭФФЕКТИВНОСТЬ

Учебное пособие

Редактор Н.В. Комардина

Компьютерная верстка и макет А.А. Гончаровой

6Vpj7-h3cxh-hbtpt-x4t74-3yvy7

Позиция плана № 18. 2003

ИД № 06430 от 10.12.01.

Подписано в печать . Формат 60х84 1/16. Печать офсетная.

Усл.печ.л. .Уч.-изд.л . Тираж 200 экз. Заказ .

Курский государственный технический университет.

Издательско-полиграфический центр Курского государственного технического университета. 305040, Курск, ул. 50 лет Октября, 94.

1 Несмотря на свое название (constructor буквально переводится как «создатель») конструктор на самом деле не создает объект, а лишь инициализирует уже выделенный для объекта участок памяти определенными значениями (определяет начальное состояние объекта). Код для выделения памяти под объект формируется компилятором неявно.

2 В отечественной (особенно переводной) литературе часто вместо «операция delete» пишут «оператор delete» (это относится и ко многим другим операциям), что совершенно некорректно. Причина некорректности – неточность перевода термина operator. Слово operator означает «операция», но никак не «оператор». Оператор же записывают как statement.

3 Деструктор аналогично конструктору не уничтожает объект (хотя destructor означает «разрушитель»), а лишь выполняет завершающие действия перед фактическим уничтожением объекта.

4 Термин «связь» использован для того, чтобы подчеркнуть различие между значением обычного указателя на объект (его значение есть адрес объекта) и указателем на компонент класса (его значением является по сути адрес компонента класса).

5 Сказанное относится только к нестатическим компонентным функциям. У статических функций никаких модификаторов вводить нельзя, поскольку они не связаны с объектами.

6 В других объектно-ориентированных языках вместо терминов «базовый» и «производный» часто используют другие. Например, в Object Pascal – соответственно «родительский» и «дочерний», в Java – соответственно «суперкласс» и «подкласс».

7 Для производного класса допускаются только ключи struct и class.

8 Класс CCenteredShape представляет абстрактное понятие и от него по смыслу нельзя создавать объекты, поэтому его лучше было бы определить как абстрактный класс (см. далее).

9 Подробная информация о виртуальных деструкторах будет дана ниже. Здесь лишь отметим, что всякий базовый класс (или класс, который предполагается использовать как базовый) должен иметь виртуальный деструктор.

10 Принято считать, что если класс содержит виртуальный деструктор, то он предназначен для использования в качестве базового класса. И обратно, если класс предполагается использовать как базовый, то в нем должен быть виртуальный деструктор.

11 Естественно, для класса SomeBaseClass должна быть определена функция-операция operator <<, иначе вывод объектов в поток будет невозможным.

12 COM = Component Object Model (модель компонентного объекта).

13 ATL = Active Template Library (библиотека активных шаблонов). ATL служит для упрощения написания приложений в рамках технологии COM.

14 При отсутствии реализации чисто виртуального деструктора возникает ошибка компоновки.

15 Сказанное справедливо только при невиртуальном базовом классе. Если же базовый класс виртуальный, то его объект будет включаться в объект производного класса только один раз.

16 Ничего не улучшит и использование макроса, если мы решим генерировать текст определения классов с его помощью, так как на вход компилятора все равно будет поступать множество практически одинаковых классов и компилятор будет создавать отдельный код для каждого класса.

17 Процесс получения определения класса по шаблону принято называть инстанцированием.

18 В библиотеке STL языка С++ имеется стандартный шаблонный класс векторов vector, поэтому наш класс в какой-то мере представляет собой попытку «изобретения велосипеда». Тем не менее для пояснения он весьма полезен.

19 В стандарте языка С++ он именуется template_id.

20 Легко заметить сходство между механизмами параметров функций и шаблонов. Однако есть и существенное отличие: у функций механизм параметров используется уже при выполнении программы, а у шаблонов – в процессе ее компиляции (при инстанцировании).

21 По стандарту С++ эти параметры именуются non-type parameters (буквально «параметры-не-типы»). Но поскольку тяжело найти благозвучный перевод для non-type parameters, мы осмелимся далее использовать термин «ординарные» параметры.

22 Согласно стандарту они называются integral promotions.

23 Здесь речь идет о полной специализации. Есть также частичная специализация, речь о ней пойдет далее.

24 Следует отметить, что перегрузка операций не имеет жесткой привязки к объектному подходу и может быть реализована даже в процедурных языках программирования. Однако она прекрасно «вписывается» в объектный подход и эффективно реализуется на его основе.

25 Под @, естественно, подразумевается какой-либо знак стандартной операции, например + или *.

26 При определенных условиях возможен даже переменный список параметров.

27 Правила определения функций-операций более подробно будут обсуждаться в дальнейшем.

28 Все, что мы говорим об операции ++, в равной мере относится и к операции ––.

29 Значение 0 подставляется компилятором автоматически.

30 Префиксную форму operator++ (operator––) легко реализовать на базе operator+=. Таким образом, достаточно поддерживать операцию +=.

31 Напомним, что перегружать операции xxxx_cast (преобразование типов в стиле С++) запрещено.

32 Правда, она возвращает указатель char *, а не const char *, что не вполне логично.

33 Следует отметить, что аналогичная проблема возникает и с конструкторами копирования в иерархиях классов.

34 Функторы являются частью стандартной библиотеки шаблонов (STL) С++ и подробно обсуждаются далее; здесь же основное внимание уделяется особенностям перегрузки операции operator().

35 Объект является первым операндом для operator(), а список аргументов – вторым.

36 В общем случае object_id – это выражение, результатом которого является объект класса, перегружающего операцию функционального вызова.

37 Для встроенных типов операции new и delete не работают с конструкторами и деструкторами, поскольку их нет, и только выделяют / освобождают память.

38 Например, объединение множеств и добавление элемента в множество можно реализовать операцией +, а перемножение матриц – операцией *.

39 Вызов деструкторов на самом деле производится только для полностью построенных объектов, при этом неважно, автономны ли они или вложены в другие объекты (в том числе и «недостроенные»).

40 Спецификации исключений применимы как к глобальным функциям, так и к компонентным функциям классов и шаблонов, и даже к шаблонам компонентных функций.

41 Буквально переводится как «не пойманное» исключение.

42 Подсчет ссылок не является специфическим механизмом языка С++, однако широко применяется в коде, написанном на С++, в частности, стандартной библиотеке, и имеет свои особенности при реализации на этом языке.

43 const_iterator – это особый вид итераторов, значение которых обладает модификатором const.

44 Есть также специальные итераторы потоков istream_iterator и ostream_iterator, упрощающие взаимодействие компонент STL с потоками (по своим возможностям они относятся к категориям входных и выходных итераторов соответственно).

45 inserter – специальный шаблон функций, формирующий адаптер итератора insert_iterator, называемый итератором вставки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]