Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
общая-шпора 37-50.doc
Скачиваний:
21
Добавлен:
15.04.2015
Размер:
128.51 Кб
Скачать

Вопрос 50

Дружественные функции

Обычно доступ к приватным элементам класса ограничивается методами этого класса. Но иногда возникает необходимость предоставить доступ к приватным данным класса внешним функциям. Определить такие внешние функции (которые могут даже находиться вне классов), которым будет предоставлена возможность доступа к приватным элементам класса, позволяет описание friend (дружественный). Иногда можно видеть, что переопределенная операция также описывается, как дружественная, но, обычно, дружественные функции используются редко. Их присутствие в программе обычно означает то, что иерархия классов нуждается в видоизменении.

Дружественные описания следует использовать только в том случае, когда это действительно необходимо, например, когда без этого пришлось бы использовать чересчур сложную иерархию классов. По своей природе дружественные описания уменьшают инкапсуляцию и модульность. В частности, если нужно определить целый класс, как дружественный для другого класса, то вместо этого лучше рассмотреть возможность построения обоюдно порождаемого класса, который можно использовать для доступа к нужным элементам.

Вопрос 46

Связь

Язык программирования С++ произошёл от Си. Однако Си и С++ развивались независимо, что привело к росту несовместимостей между ними. Последняя редакция Си, С99, добавила в язык несколько конфликтующих с С++ особенностей. Эти различия затрудняют написание программ и библиотек, которые могли бы нормально компилироваться и работать одинаково компиляторах Си и С++, что, конечно, запутывает тех, кто программирует на обоих языках. Бьярне Строуструп, придумавший С++, неоднократно выступал за максимальное сокращение различий между Си и С++ для создания максимальной совместимости между этими языками. Противники же такой точки зрения считают, что так как Си и С++ являются двумя различными языками, то и совместимость между ними не так важна, хоть и полезна. Согласно этому лагерю, усилия по уменьшению несовместимости между ними не должны препятствовать попыткам улучшения каждого языка в отдельности. Вот различия между этими языками, существующие на сегодня:

inline — подставляемые функции существуют в глобальном пространстве С++, а в Си — в пространстве файла (статическом пространстве). Другими словами, это значит, что в С++ любое определение подставляемой функции (независимо от переопределения функций) должно соответствовать правилу одного определения, требующего того, чтобы любая подставляемая функция была определена только один раз. В Си же одна и та же подставляемая функция может быть определена по-разному в разных компилируемых файлах одной программы. В отличие от С++, ключевое слово bool в С99 требует включения соответствующего заголовочного файла stdbool.h. Предыдущие стандарты Си не определяли булевый тип вообще, поэтому для этого часто использовались различные (а значит, несовместимые) методы. Символьные константы (заключённые в одинарные кавычки) имеют тип int в Си и тип char в С++. Поэтому в Си справедливо равенство sizeof('a') == sizeof(int), а в С++ — равенство sizeof('a') == sizeof(char).

Некоторые новые возможности C99, в первую очередь, restrict, не включены в стандарт C++. Си перенял от С++ ряд особенностей:

прототипы объявления функций;

однострочные комментарии, начинающиеся на // и заканчивающиеся символом перевода строки;

ключевое слово inline;

более сильную проверку типов, включая добавление типа void, спецификатора const и удаление принятия по умолчанию типа int в качестве возвращаемого значения. Язык Си++ во многом является надмножеством Си. Новые возможности Си++ включают объявления в виде выражений, преобразования типов в виде функций, операторы new и delete, тип bool, ссылки, расширенное понятие константности, подставляемые функции, аргументы по умолчанию, переопределения, пространства имён, классы (включая и все связанные с классами возможности, такие как наследование, функции-члены, виртуальные функции, абстрактные классы и конструкторы), переопределения операторов, шаблоны, оператор ::, обработку исключений, динамическую идентификацию и многое другое. Язык Си++ также во многих случаях строже относится к проверке типов, чем Си. В Си++ появились комментарии в виде двойной косой черты («//»), которые были в предшественнике Си — языке BCPL. Некоторые особенности Си++ позднее были перенесены в Си, например ключевые слова const и inline, объявления в циклах for и комментарии в стиле Си++ («//»). В более поздних реализациях Си также были представлены возможности, которых нет в Си++, например макросы vararg и улучшенная работа с массивами-параметрами.

Вопрос № 47

Принципы объектно-ориентированного программирования

ООП объединило лучшие идеи структурированного я рядом мощных концепции, который способствуют более эффективной организации программ. Любую программу можно организовать одним и двух способов : опираясь на код программы или на данные. При структурированном программировании опираются обычно только на код. Механизм ООП основана на выборе второго способа. В этом случае ключевым принципом является использование «данных, управляющих доступом к коду». В любом ОО языке программирования определяются данные и процедуры, которые разрешается применить к этим данным. Таким образом, тип данных в точности определяет, операции какого вида можно применить к этим данным. ООП характеризуется следующими принципами: инкапсуляция, полиморфизм, наследование.

Инкапсуляция.

Это такой механизм программирования, который связывает воедино код и данные, им обрабатываемые, чтобы обезопасить их как от внешнего вмешательства, так и от неправильного использования. В ОО языке код и данные могут быть связаны способом, при котором создается самодостаточный «ящик». В нем содержаться все необходимые данные и код. При таком связывании кода и данных создается объект, то есть объект — это конструкция, которая поддерживает инкапсуляцию. Инкапсуляция, или утаивание информации (information hiding), — это возможность скрыть внутреннее устройство объекта от его пользователей, предоставив через интерфейс доступ только к тем членам объекта, с которыми клиенту разрешается работать напрямую. Поскольку в том же контексте я говорил также об абстрагировании, то считаю нужным пояснить разницу между этими похожими понятиями. Инкапсуляция подразумевает наличие границы между внешним интерфейсом класса (открытыми членами, видимыми пользователям класса) и деталями его внутренней реализации. Преимущество инкапсуляции для разработчика в том, что он может открыть те члены класса, которые будут оставаться статичными, или неизменяемыми, скрыв внутреннюю организацию класса, более динамичную и в большей степени подверженную изменениям.

Полиморфизм

это свойство, позволяющее использовать один интерфейс для целого класса действий. Для группы связанных действий можно использовать один обобщенный интерфейс. Таким образом, это функциональная возможность, позволяющая старому коду вызвать новый. Это свойство ООП, пожалуй, наиболее ценно, поскольку дает вам возможность расширять и совершенствовать свою систему, не затрагивая существующий код

Наследование

Наследованием называют возможность при описании класса указывать на его происхождение (kind-of relationship) от другого класса. Наследование позволяет создать новый класс, в основу которого положен существующий. В полученный таким образом класс можно внести свои изменения, а затем создать новые объекты данного типа. Этот механизм лежит в основе создания иерархии классов. После абстрагирования наследование — наиболее значимая часть общего планирования системы. Производным (derived class) называется создаваемый класс, производный от базового (base class). Производный класс наследует все методы базового, позволяя задействовать результаты прежнего труда.