Arkanium77

ЭКЗАМЕН, БИЛЕТЫ

Jun 23rd, 2017
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.16 KB | None | 0 0
  1. 1. Классы. Синтаксис объявления классов в С++.
  2. Класс — универсальный, комплексный тип данных, состоящий из тематически единого набора «полей» (переменных более элементарных типов) и «методов» (функций для работы с этими полями), то есть он является моделью информационной сущности с внутренним и внешним интерфейсами для оперирования своим содержимым (значениями полей).
  3. Говоря о С++ про классы так же можно сказать, что класс – структура с методами, т.к. ещё в НЕ объектно-ориентированном С существовало такое понятие, как «структура» - комплексный тип данных, включающий в себя «поля» других типов.
  4. class /*имя класса*/
  5. {
  6.   private:
  7.   /* список свойств и методов для использования внутри класса */
  8.   public:
  9.   /* список методов доступных другим функциям и объектам программы */
  10.   protected:
  11.   /*список средств, доступных при наследовании*/
  12. };
  13.  
  14. Однако, стоит отметить, что на самом деле класс принято только /описывать/ в подобном синтаксисе, в head-файле, а реализовывать отдельно в cpp-файле. В таком случае для указания к какому классу вы обращаетесь из вне нужно использовать оператор ::
  15. Например, дл реализации метода типа void:
  16. void ИМЯКЛАССА : : НАЗВАНИЕМЕТОДА (){}
  17.  
  18. 2. Конструкторы и деструкторы класса. Конструктор копирования.
  19. Конструктор – блок инструкций, вызываемый в момент создания объекта соответствующего класса. Конструкторы бывают разные: поумолчанию(без параметров), с параметрами, копирующие, конструкторы преобразования(приведения типов).
  20. Но в общем и целом конструктор ВСЕГДА не имеет возвращаемого значения и называется точно так же как класс.
  21. Деструктор же вызывается в момент разрушения объекта. Нужен для корректного освобождения памяти или каких-то особых инструкций, которые могут вам понадобиться после разрушения объекта (например, время его жизни куда-то сохранить). Может быть вызван явно, однако в основном это происходит автоматически
  22. Конструктором копирования называется специальный конструктор в языке программирования C++ и в некоторых других языках программирования, например, Java, применяемый для создания нового объекта как копии уже существующего. Такой конструктор принимает как минимум один аргумент: ссылку на копируемый объект.
  23. Обычно компилятор автоматически создает конструктор копирования для каждого класса, однако если это объект динамического типа или же у программиста есть какие-то особые мысли по поводу того, как должен копироваться объект его класса он создаёт конструктор копирования в ручную. В таком случае он заменяет неявный.
  24.  
  25. 3. Доступ к членам класса. Дружественные функции.
  26. Доступность членов класса определяется так называемыми «модификаторами доступа»: private, protected, public. Наличие этих модификаторов обусловлено одним из принципов ООП – инкапусляцией.
  27.     Public — доступ открыт всем, кто видит определение данного класса.
  28.     Private — доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.
  29.     Protected — доступ открыт классам, производным от данного и всё, что открыто для private
  30. class /*имя класса*/
  31. {
  32.   private:
  33.   /* список свойств и методов для использования внутри класса */
  34.   public:
  35.   /* список методов доступных другим функциям и объектам программы */
  36.   protected:
  37.   /*список средств, доступных при наследовании*/
  38. };
  39.  
  40. Дружественная функция — это функция, которая не является членом класса, но имеет доступ к членам класса, объявленным в полях private или protected. Для её задания используется ключевое слово friend. Дружественная функция может быть описана в другом классе, стандартной библиотеке или вообще быть глобальной, а в ваш класс добавляется её прототип с ключевым словом friend.
  41.  
  42. 4. Перегрузка операторов. Перегрузка операторов с помощью дружественных функций.
  43. Перегрузка операторов в программировании — один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.
  44. Для перегрузки операторов используется ключевое слово operator, а в дальнейшем описание происходит как и с обычной функцией. В духе:
  45. Rat operator+ (Rat b){};
  46. Отличие дружественных функций-операторов от обычных функций-операторов, членов класса, состоит в том что для них не используется указатель this При объявлении дружественной функции оператора должны передаваться два аргумента для бинарных операторов и один для унарных операций (В то время как для операторов-членов класса первым аргументом всегда является объект, от которого оператор вызван). Это, например, сделает более очевидной операцию сложения. C помощью обычного переопределённого оператора мы можем сложить Rat и double, но не наоборот, однако это не правильно с точки зрения логики. В таком случае вполне оправдано использование дружественного оператора где double – первый аргумент, а Rat – второй.
  47.  
  48. 5. Наследование классов. И  6. Множественное наследование. Виртуальные классы.
  49.  
  50. Наследование — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.
  51. Класс, опредёленный через наследование от другого класса, называется: производным классом, классом потомком или подклассом. Класс, от которого новый класс наследуется, называется: родителем, базовым классом или суперклассом.
  52. В C++ наследование может быть множественным (т.е. новый класс может иметь несколько родителей), что способствует появлению тонн ошибок, но в какие-то моменты действительно помогает.
  53. Кроме того, в C++ можно наследовать с модификатором доступа и «виртуально» (ключ. Слово virtual)
  54.     private protected   public
  55. Доступ из тела класса  открыт     открыт    открыт
  56. Доступ из производных классов  закрыт     открыт    открыт
  57. Доступ из внешних функций и классов    закрыт    закрыт     открыт
  58.  
  59. Виртуальное наследование нужно для решения проблемы ромбовидного наследования (появляющейся из-за множественного наследования). Класс, который в иерархии встречается несколько раз должен быть определён виртуально и только тогда обращение к нему будет однозначным.
  60.  
  61. 7. Виртуальные функции. Указатели на базовый класс.
  62. Виртуальная функция — это функция, объявленная с ключевым словом virtual в базовом классе и переопределенная в одном или в нескольких производных классах. Виртуальные функции являются особыми функциями, потому что при вызове объекта производ¬ного класса с помощью указателя или ссылки на него С++ определяет во время исполнения про¬граммы, какую функцию вызвать, основываясь на типе объекта. Для разных объектов вызываются разные версии одной и той же виртуальной функции. Класс, содержащий одну или более вир¬туальных функций, называется полиморфным, виртуальным или абстрактным классом
  63. Виртуальная функция объявляется в базовом классе с использованием ключевого слова virtual. Когда же она переопределяется в производном классе, повторять ключевое слово virtual нет не-обходимости
  64. Указатель на базовый класс можно инициализировать через конструктор класса потомка и он будет работать корректно, однако стоит помнить, что он может вызывать только методы определённые в базовом классе. Если такие методы определены, то, в первую очередь, он попытается вызывать метод от того потомка, которым был инициализирован и дальше будет подниматься вверх по иерархии.
  65.  
  66. 8. Чисто виртуальные функции и абстрактные классы.
  67. Виртуальная функция — это функция, объявленная с ключевым словом virtual в базовом классе и переопределенная в одном или в нескольких производных классах. Виртуальные функции являются особыми функциями, потому что при вызове объекта производ¬ного класса с помощью указателя или ссылки на него С++ определяет во время исполнения про¬граммы, какую функцию вызвать, основываясь на типе объекта. Для разных объектов вызываются разные версии одной и той же виртуальной функции. Класс, содержащий одну или более вир¬туальных функций, называется полиморфным, виртуальным или абстрактным классом
  68. Виртуальная функция объявляется в базовом классе с использованием ключевого слова virtual. Когда же она переопределяется в производном классе, повторять ключевое слово virtual нет не-обходимости
  69. Кроме того, в C++ можно наследовать «виртуально» (ключ. Слово virtual)
  70. Виртуальное наследование нужно для решения проблемы ромбовидного наследования (появляющейся из-за множественного наследования). Класс, который в иерархии встречается несколько раз должен быть наследован виртуально и только тогда обращение к нему будет однозначным.
  71. 9. Шаблоны в С++. Обобщенные функции и обобщенные классы.
  72. Шабло́ны (ключевое слово template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).
  73. В C++ возможно создание шаблонов функций и классов.
  74. Шаблоны позволяют создавать параметризованные классы и функции. Параметром может быть любой тип.
  75. Пример шаблона класса:
  76. template < int ArrayLength, typename SomeValueType > class SomeClass{
  77.     SomeValueType SomeValue;
  78.     SomeValueType SomeArray[ ArrayLength ];
  79.     ...
  80. };
  81.  
  82. Пример шаблона функции:
  83. template< typename T >
  84. void sort( T array[], int size ){...};
  85.  
  86. 10. Стандартная библиотека шаблонов STL.
  87. Библиотека стандартных шаблонов (STL) (англ. Standard Template Library) — набор согласованных обобщённых алгоритмов, контейнеров, средств доступа к их содержимому и различных вспомогательных функций в C++.
  88. В библиотеке выделяют пять основных компонентов:
  89. • Контейнер (англ. container) — хранение набора объектов в памяти.
  90. • Итератор (англ. iterator) — обеспечение средств доступа к содержимому контейнера.
  91. • Алгоритм (англ. algorithm) — определение вычислительной процедуры.
  92. • Адаптер (англ. adaptor) — адаптация компонентов для обеспечения различного интерфейса.
  93. • Функциональный объект (англ. functor) — сокрытие функции в объекте для использования другими компонентами.
  94.  
  95. Разделение позволяет уменьшить количество компонентов. Например, вместо написания отдельной функции поиска элемента для каждого типа контейнера обеспечивается единственная версия, которая работает с каждым из них, пока соблюдаются основные требования.
  96. Одним из самых простых и часто используемых контейнеров является vector – по сути, динамический массив, который автоматически расширяется по надобности.
Advertisement
Add Comment
Please, Sign In to add comment