Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 1. Классы. Синтаксис объявления классов в С++.
- Класс — универсальный, комплексный тип данных, состоящий из тематически единого набора «полей» (переменных более элементарных типов) и «методов» (функций для работы с этими полями), то есть он является моделью информационной сущности с внутренним и внешним интерфейсами для оперирования своим содержимым (значениями полей).
- Говоря о С++ про классы так же можно сказать, что класс – структура с методами, т.к. ещё в НЕ объектно-ориентированном С существовало такое понятие, как «структура» - комплексный тип данных, включающий в себя «поля» других типов.
- class /*имя класса*/
- {
- private:
- /* список свойств и методов для использования внутри класса */
- public:
- /* список методов доступных другим функциям и объектам программы */
- protected:
- /*список средств, доступных при наследовании*/
- };
- Однако, стоит отметить, что на самом деле класс принято только /описывать/ в подобном синтаксисе, в head-файле, а реализовывать отдельно в cpp-файле. В таком случае для указания к какому классу вы обращаетесь из вне нужно использовать оператор ::
- Например, дл реализации метода типа void:
- void ИМЯКЛАССА : : НАЗВАНИЕМЕТОДА (…){…}
- 2. Конструкторы и деструкторы класса. Конструктор копирования.
- Конструктор – блок инструкций, вызываемый в момент создания объекта соответствующего класса. Конструкторы бывают разные: поумолчанию(без параметров), с параметрами, копирующие, конструкторы преобразования(приведения типов).
- Но в общем и целом конструктор ВСЕГДА не имеет возвращаемого значения и называется точно так же как класс.
- Деструктор же вызывается в момент разрушения объекта. Нужен для корректного освобождения памяти или каких-то особых инструкций, которые могут вам понадобиться после разрушения объекта (например, время его жизни куда-то сохранить). Может быть вызван явно, однако в основном это происходит автоматически
- Конструктором копирования называется специальный конструктор в языке программирования C++ и в некоторых других языках программирования, например, Java, применяемый для создания нового объекта как копии уже существующего. Такой конструктор принимает как минимум один аргумент: ссылку на копируемый объект.
- Обычно компилятор автоматически создает конструктор копирования для каждого класса, однако если это объект динамического типа или же у программиста есть какие-то особые мысли по поводу того, как должен копироваться объект его класса он создаёт конструктор копирования в ручную. В таком случае он заменяет неявный.
- 3. Доступ к членам класса. Дружественные функции.
- Доступность членов класса определяется так называемыми «модификаторами доступа»: private, protected, public. Наличие этих модификаторов обусловлено одним из принципов ООП – инкапусляцией.
- Public — доступ открыт всем, кто видит определение данного класса.
- Private — доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.
- Protected — доступ открыт классам, производным от данного и всё, что открыто для private
- class /*имя класса*/
- {
- private:
- /* список свойств и методов для использования внутри класса */
- public:
- /* список методов доступных другим функциям и объектам программы */
- protected:
- /*список средств, доступных при наследовании*/
- };
- Дружественная функция — это функция, которая не является членом класса, но имеет доступ к членам класса, объявленным в полях private или protected. Для её задания используется ключевое слово friend. Дружественная функция может быть описана в другом классе, стандартной библиотеке или вообще быть глобальной, а в ваш класс добавляется её прототип с ключевым словом friend.
- 4. Перегрузка операторов. Перегрузка операторов с помощью дружественных функций.
- Перегрузка операторов в программировании — один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.
- Для перегрузки операторов используется ключевое слово operator, а в дальнейшем описание происходит как и с обычной функцией. В духе:
- Rat operator+ (Rat b){…};
- Отличие дружественных функций-операторов от обычных функций-операторов, членов класса, состоит в том что для них не используется указатель this При объявлении дружественной функции оператора должны передаваться два аргумента для бинарных операторов и один для унарных операций (В то время как для операторов-членов класса первым аргументом всегда является объект, от которого оператор вызван). Это, например, сделает более очевидной операцию сложения. C помощью обычного переопределённого оператора мы можем сложить Rat и double, но не наоборот, однако это не правильно с точки зрения логики. В таком случае вполне оправдано использование дружественного оператора где double – первый аргумент, а Rat – второй.
- 5. Наследование классов. И 6. Множественное наследование. Виртуальные классы.
- Наследование — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.
- Класс, опредёленный через наследование от другого класса, называется: производным классом, классом потомком или подклассом. Класс, от которого новый класс наследуется, называется: родителем, базовым классом или суперклассом.
- В C++ наследование может быть множественным (т.е. новый класс может иметь несколько родителей), что способствует появлению тонн ошибок, но в какие-то моменты действительно помогает.
- Кроме того, в C++ можно наследовать с модификатором доступа и «виртуально» (ключ. Слово virtual)
- private protected public
- Доступ из тела класса открыт открыт открыт
- Доступ из производных классов закрыт открыт открыт
- Доступ из внешних функций и классов закрыт закрыт открыт
- Виртуальное наследование нужно для решения проблемы ромбовидного наследования (появляющейся из-за множественного наследования). Класс, который в иерархии встречается несколько раз должен быть определён виртуально и только тогда обращение к нему будет однозначным.
- 7. Виртуальные функции. Указатели на базовый класс.
- Виртуальная функция — это функция, объявленная с ключевым словом virtual в базовом классе и переопределенная в одном или в нескольких производных классах. Виртуальные функции являются особыми функциями, потому что при вызове объекта производ¬ного класса с помощью указателя или ссылки на него С++ определяет во время исполнения про¬граммы, какую функцию вызвать, основываясь на типе объекта. Для разных объектов вызываются разные версии одной и той же виртуальной функции. Класс, содержащий одну или более вир¬туальных функций, называется полиморфным, виртуальным или абстрактным классом
- Виртуальная функция объявляется в базовом классе с использованием ключевого слова virtual. Когда же она переопределяется в производном классе, повторять ключевое слово virtual нет не-обходимости
- Указатель на базовый класс можно инициализировать через конструктор класса потомка и он будет работать корректно, однако стоит помнить, что он может вызывать только методы определённые в базовом классе. Если такие методы определены, то, в первую очередь, он попытается вызывать метод от того потомка, которым был инициализирован и дальше будет подниматься вверх по иерархии.
- 8. Чисто виртуальные функции и абстрактные классы.
- Виртуальная функция — это функция, объявленная с ключевым словом virtual в базовом классе и переопределенная в одном или в нескольких производных классах. Виртуальные функции являются особыми функциями, потому что при вызове объекта производ¬ного класса с помощью указателя или ссылки на него С++ определяет во время исполнения про¬граммы, какую функцию вызвать, основываясь на типе объекта. Для разных объектов вызываются разные версии одной и той же виртуальной функции. Класс, содержащий одну или более вир¬туальных функций, называется полиморфным, виртуальным или абстрактным классом
- Виртуальная функция объявляется в базовом классе с использованием ключевого слова virtual. Когда же она переопределяется в производном классе, повторять ключевое слово virtual нет не-обходимости
- Кроме того, в C++ можно наследовать «виртуально» (ключ. Слово virtual)
- Виртуальное наследование нужно для решения проблемы ромбовидного наследования (появляющейся из-за множественного наследования). Класс, который в иерархии встречается несколько раз должен быть наследован виртуально и только тогда обращение к нему будет однозначным.
- 9. Шаблоны в С++. Обобщенные функции и обобщенные классы.
- Шабло́ны (ключевое слово template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).
- В C++ возможно создание шаблонов функций и классов.
- Шаблоны позволяют создавать параметризованные классы и функции. Параметром может быть любой тип.
- Пример шаблона класса:
- template < int ArrayLength, typename SomeValueType > class SomeClass{
- SomeValueType SomeValue;
- SomeValueType SomeArray[ ArrayLength ];
- ...
- };
- Пример шаблона функции:
- template< typename T >
- void sort( T array[], int size ){...};
- 10. Стандартная библиотека шаблонов STL.
- Библиотека стандартных шаблонов (STL) (англ. Standard Template Library) — набор согласованных обобщённых алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций в C++.
- В библиотеке выделяют пять основных компонентов:
- • Контейнер (англ. container) — хранение набора объектов в памяти.
- • Итератор (англ. iterator) — обеспечение средств доступа к содержимому контейнера.
- • Алгоритм (англ. algorithm) — определение вычислительной процедуры.
- • Адаптер (англ. adaptor) — адаптация компонентов для обеспечения различного интерфейса.
- • Функциональный объект (англ. functor) — сокрытие функции в объекте для использования другими компонентами.
- Разделение позволяет уменьшить количество компонентов. Например, вместо написания отдельной функции поиска элемента для каждого типа контейнера обеспечивается единственная версия, которая работает с каждым из них, пока соблюдаются основные требования.
- Одним из самых простых и часто используемых контейнеров является vector – по сути, динамический массив, который автоматически расширяется по надобности.
Advertisement
Add Comment
Please, Sign In to add comment