Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

125 Кібербезпека / Магістр (вступні питання)

.pdf
Скачиваний:
107
Добавлен:
23.10.2019
Размер:
3.84 Mб
Скачать

Способи перевантаження функцій:

Перевантажені функції мають мати різну кількість параметрів або типи даних.

Мати однакове ім'я функції, яке буде використовуватись для виклику всіх її варіантів.

Перевантаження функцій відноситься до класифікації статичного поліморфізму, в якому буде викликано найбільш підходящу функцію, тобто,

функція визначається на основі списку її аргумент. Перевантаження функцій часто пов'язане з статично типізованими мовами програмування, які потребують перевірки типів при виклику функцій. Перевантажуючи метод,

створюється множина різних методів, які мають одне і те саме ім'я. Рішення,

про те яка функція буде викликана відбувається у період компіляції.

Перевантаження методів не слід плутати з поліморфізмом, при якому потрібний метод обирається під час виконання, за допомогою віртуальних методів, замість статичних.

57. Вказівники в мовах програмування. Операції над вказівниками.

Вказівник - змінна, значенням якої є адреса комірки пам'яті. Тобто покажчик посилається на блок даних з області пам'яті, причому на саме його початок. Покажчик може посилатися на змінну або функцію. Для цього потрібно знати адресу змінної або функції. Так ось, щоб дізнатися адресу конкретної змінної в С++ існує унарна операція взяття адреси &. Така операція витягує адреса оголошених змінних, для того, щоб його привласнити покажчику.

Покажчики використовуються для передачі за посиланням даних, що набагато прискорює процес обробки цих даних (в тому випадку, якщо обсяг даних великий), так як їх не треба копіювати, як при передачі за значенням, тобто, використовуючи ім'я змінної. Зазвичай покажчики використовуються для організації динамічного розподілу пам'яті, наприклад при оголошенні масиву, не треба буде його обмежувати в розмірі. Адже програміст заздалегідь не може знати, якого розміру потрібен масив того чи іншого користувачеві, в такому випадку використовується динамічне виділення пам'яті під масив. Будь покажчик необхідно оголосити перед використанням, як і будь-яку змінну.

Принцип оголошення покажчиків такий же, як і принцип оголошення змінних. Відмінність полягає лише в тому, що перед ім'ям ставиться символ зірочки *. Візуально покажчики відрізняються від змінних тільки одним символом. При оголошенні покажчиків компілятор виділяє кілька байт пам'яті, в залежності від типу даних відводяться для зберігання деякої інформації в пам'яті. Щоб отримати значення, записане в деякій області, на яке посилається покажчик потрібно скористатися операцією разименованія покажчика *. Необхідно поставити зірочку перед ім'ям і отримаємо доступ до значення покажчика. Розробимо програму, яка буде використовувати покажчики.

Над покажчиками можна виконувати унарні операції: інкремент і декремент. При виконанні операцій ++ і - значення покажчика збільшується або зменшується на довжину типу, на який посилається використовуваний покажчик.

В операції віднімання можуть брати участь два покажчика на один і той же тип. Результат такої операції має тип int і дорівнює числу елементів вихідного типу між зменшуваним і віднімаються, причому якщо перша адреса молодше, то результат має від'ємне значення.

58. Переваги та недоліки використання вказівників.

Ваше выделенное правило очень мудрое. Это избавит вас от неприятностей, но рано или поздно вам нужно будет научиться указателям.

Итак, почему мы хотим использовать указатели?

Скажем, я открыл текстовый файл и прочитал его в гигантскую строку. Я не могу передать вам гигантскую строку по значению, потому что она слишком большая, чтобы поместиться в стек (скажем, 10 Мб). Поэтому я рассказываю вам, где находится строка, и говорим: "Иди посмотри туда на мою строку".

Массив - это указатель (ну почти).

int [] и int * являются по-разному, но взаимозаменяемы по большей части.

int[] i = new int[5]; // garbage data

int* j = new int[5] // more garbage data but does the same thing

std::cout << i[3] == i + 3 * sizeof(int); // different syntax for the same thing

Более продвинутое использование указателей, которые чрезвычайно полезны, - это использование указателей функций. В C и С++ функции не являются первоклассными типами данных, но указателями являются. Таким образом, вы можете передать указатель на функцию, которую вы хотите вызвать, и они могут это сделать.

Надеюсь, что это поможет, но более чем вероятно будет запутать.

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

Например, у вас может быть огромный struct MyStruct, и у вас есть

функция a().

59. Складені типи даних (масив, структура, об’єднання). Їх ініціалізація та використання.

Структура даних (СД) - загальна властивість інформаційного об'єкта, з яким взаємодіє та або інша програма. Ця загальна властивість характеризується:

множиною допустимих значень цієї структури;

набором допустимих операцій;

характером організованості.

Упереважній більшості мов програмування масив є стандартною вбудованою структурою даних.

Маси́в — впорядкований набір фіксованої кількості однотипних елементів, що зберігаються в послідовно розташованих комірках оперативної пам'яті, мають порядковий номер і спільне ім'я, що надає користувач.

Характеристика масиву

Розмірність — кількість індексів елемента (одновимірний, двовимірний, ..., багатовимірний)

Розмір — загальна кількість елементів у масиві.

За типом поділяється на числовий та символьний.

В кожній мові є свої правила опису масив (у мові Бейсик — командою DIM <список масивів>]]).

В програмуванні масив (англ. array) — сукупність елементів одного типу даних, впорядкованих за індексами, які зазвичай репрезентовані натуральними числами, що визначають положення елемента в масиві.

Масив може бути одновимірним (вектором), та багатовимірним (наприклад, двовимірною таблицею), тобто таким, де індексом є не одне число, а кортеж (сукупність) з декількох чисел, кількість яких збігається з розмірністю масиву.

У переважній більшості мов програмування масив є стандартною вбудованою структурою даних.

Масиви ефективні при звертанні до довільного елементу, яке відбувається за постійний час (O(1)), однак такі операції як додавання та видалення елементу, потребують часу O(n), де n — розмір масиву. Тому масиви переважно використовуються для зберігання даних, до елементів яких відбувається довільний доступ без додавання або видалення нових елементів, тоді як для алгоритмів з інтенсивними операціями додавання та видалення, ефективнішими є зв'язані списки.

60. Особливості роботи з стрічковим (string) типом даних в мовах програмування

Рядок (англ. String — «нитка, низка») або рядковий тип даних — це тип даних, значеннями якого є довільна послідовність (рядок) символів алфавіту. Кожна змінна такого типу (рядкова змінна) може бути представлена фіксованою кількістю байтів або мати довільну довжину.

Реалізація в мовах програмування:

У перших мовах програмування взагалі не було рядкового типу; програміст повинен був сам будувати функції для роботи з рядками того чи іншого типу.

У Сі використовуються нуль-терміновані рядки з повним ручним контролем з боку програміста.

У стандартному Паскалі рядок виглядає як масив з 256 байтів; перший байт зберігав довжину рядка, в інших зберігається її тіло. Таким чином, довжина рядка не може перевищувати 255 символів. У Borland Pascal 7.0 також з'явилися рядки «по типу Сі» — очевидно, через те, що в число підтримуваних платформ увійшла Windows.

У Object Pascal та C++ STL рядок є «чорним ящиком», в якому виділення / вивільнення пам'яті відбувається автоматично — без участі програміста. При створенні рядка пам'ять виділяється автоматично; як тільки на рядок не залишиться жодного посилання, пам'ять повертається системі. Перевага цього методу в тому, що програміст не замислюється над роботою рядків. З іншого боку, програміст має недостатній контроль над роботою програми в критичних до швидкості ділянках; також важко реалізується передача таких рядків як параметр в DLL. Також Object Pascal автоматично стежить, щоб в кінці рядка був символ з кодом 0. Тому якщо функція вимагає на вході нуль-

термінований рядок, для конвертації треба просто

написати PAnsiChar(рядкова_змінна) або PWideChar (рядкова_змінна) (для

Pascal) , змінна c_str() (для Builder / STL) .

У C # та іншими мовами із збіркою сміття рядок є незмінним об'єктом; якщо рядок потрібно модифікувати, створюється інший об'єкт. Цей метод повільний і витрачає чимало тимчасової пам'яті, але добре поєднується з концепцією збірки сміття. Перевага цього методу в тому, що присвоювання відбувається швидко і без дублювання рядків. Також є деякий ручний контроль над конструюванням рядків (в Java, наприклад, через класи StringBuffer і StringBuilder) — це дозволяє зменшити кількість виділень і вивільнень пам'яті і, відповідно, збільшити швидкість.

У деяких мовах (наприклад, Standard ML) крім цього, є додатковий модуль для забезпечення ще більшої ефективності — «підрядок» (SubString). Його використання дозволяє виконувати операції над рядками без копіювання їхніх тіл за допомогою маніпулювання індексами початку і кінця підрядка; фізичне копіювання відбувається лише при необхідності перетворення підрядків у рядки.

61.Основні принципи об'єктно-орієнтованого програмування: абстракція, інкапсуляція, наслідування й поліморфізм

Об'єктно-орієнтоване програмування — це метод програмування, заснований на поданні програми у вигляді сукупності взаємодіючих об'єктів, кожен з яких є екземпляром певного класу, а класи є членами певної ієрархії наслідування

Інкапсуляція — один з трьох основних механізмів об'єктно-орієнтованого програмування. Йдеться про те, що об‘єкт вміщує не тільки дані, але і правила їх обробки, оформлені в вигляді виконуваних фрагментів (методів). А також про те, що доступ до стану об'єкта напряму заборонено, і ззовні з ним можна взаємодіяти виключно через заданий інтерфейс (відкриті поля та методи), що дозволяє знизити зв'язність. Таким чином контролюються звернення до полів класів та їхня правильна ініціалізація, усуваються можливі помилки пов'язані з неправильним викликом методу. Оскільки користувачі працюють лише через відкриті елементи класів, то розробники класу можуть як-завгодно змінювати всі закриті елементи і навіть перейменовувати та видаляти їх, не турбуючись, що десь хтось їх використовує у своїх програмах.

В об'єктно-орієнтованому програмуванні, успадкува́ння (наслідування) — механізм утворення нових класів на основі використання вже існуючих. При цьому властивості та функціональність батьківського класу переходять до класу нащадка (дочірнього).

Поліморфізм означає залежність поведінки від класу, в якому ця поведінка викликається, тобто, два або більше класів можуть реагувати порізному на однакові повідомлення. Наприклад, якщо Собака отримує команду голос(), то у відповідь можна отримати Гав; якщо Свиня отримує команду голос (), то у відповідь можна отримати Рох-рох. На практиці - це реалізовується шляхом реалізації ряду підпрограм (функцій, процедур, методи тощо) з однаковими іменами, але з різними параметрами. В залежності від того, що передається і вибирається відповідна підпрограма.

Абстрагування Спрощення складної дійсності шляхом моделювання класів, що

відповідають проблемі, та використання найприйнятнішого рівня деталізації окремих аспектів проблеми. Наприклад Собака Сірко більшу частину часу може розглядатись як Собака, а коли потрібно отримати доступ до інформації специфічної для собак породи коллі — як Коллі і як Тварина (можливо, батьківський клас Собака) при підрахунку тварин Петра.

62.Класи і об’єкти в ООП. Створення та знищення екземплярів класу

В об'єктно-орієнтованому програмуванні, клас — це спеціальна конструкція, яка використовується для групування пов'язаних змінних та функцій. При цьому, згідно з термінологією ООП, глобальні змінні класу (члени-змінні) називаються полями даних (також властивостями або атрибутами), а члени-функції називають методами класу. Створений та ініціалізований екземпляр класу називають об'єктом класу. На основі одного класу можна створити безліч об'єктів, що відрізнятимуться один від одного своїм станом (значеннями полів).

Класи та екземпляри класів

Клас можна порівнювати з формою для випічки печива — форма одна, а печива можна випекти безліч. Печиво — це конкретні об'єкти, екземпляри класу печиво, яке може бути з різною начинкою. Поля дозволяють вмістити дані про певний реальний об'єкт, а методи здійснювати обробку цих даних.

Через методи реалізується поведінка об'єктів. Практично вся робота з об'єктами відбувається через методи. Метод, який проводить створення та початкову ініціалізацію екземпляра класу називають конструктором класу. Метод, який проводить знищення об'єкта, називають деструктором класу.

Об'єкт в об'єктно-орієнтованому програмуванні (ООП) — ключове поняття об'єктно-орієнтованих технологій проектування та програмування[1]; втілення абстрактної моделі[2] окремої сутності (предмету або поняття), що має чітко виражене функціональне призначення в деякій області, належить до визначеного класу та характеризується своїми властивостями та поведінкою[3]. Об'єкти є базовими елементами побудови програми — програма в ООП розглядається як сукупність об'єктів, що знаходяться у визначених відношеннях та обмінюються повідомленнями.

63. Атрибути та методи для класів. Специфікатори доступу для забезпечення інкапсуляції

Атрибут - це значення, що характеризує об'єкт в його класі. Приклади атрибутів: категорія, баланс, кредит (атрибути об'єктів класу рахунок); ім'я, вік, вага (атрибути об'єктів класу людина) і т.д.

Серед атрибутів розрізняються постійні атрибути (константи) і змінні атрибути. Постійні атрибути характеризують об'єкт в його класі (наприклад, номер рахунку, категорія, ім'я людини і т.п.). Поточні значення змінних атрибутів характеризують поточний стан об'єкта (наприклад, баланс рахунку, вік людини і т.п.); змінюючи значення цих атрибутів, ми змінюємо стан об'єкта.

Метод в об'єктно-орієнтованому програмуванні - це функція або процедура, що належить якомусь класу або об'єкту.

Як і процедура в процедурному програмуванні, метод складається з певної кількості операторів для виконання якоїсь дії, має набір вхідних аргументів і повертає значення.

Розрізняють прості методи і статичні методи (методи класу):

прості методи мають доступ до даних об'єкта (конкретного екземпляра даного класу), статичні методи не мають доступу до даних об'єкта і для їх використання не потрібно створювати екземпляри (даного класу).

Методи надають інтерфейс, за допомогою якого здійснюється доступ до даних об'єкта деякого класу, тим самим, забезпечуючи інкапсуляцію даних.

Залежно від того, який рівень доступу надає той чи інший метод, виділяють:

відкритий (public) інтерфейс - загальний інтерфейс для всіх користувачів даного класу;

захищений (protected) інтерфейс - внутрішній інтерфейс для всіх спадкоємців даного класу;

закритий (private) інтерфейс - інтерфейс, доступний тільки зсередини даного класу.

Такий поділ інтерфейсів дозволяє зберігати незмінним відкритий інтерфейс, але змінювати внутрішню реалізацію.

Основу ООП складають чотири основні концепції: інкапсуляція, успадкування, поліморфізм та абстракція. Одною з

переваг ООП є краща модульність програмного забезпечення (тисячу функцій процедурної мови, в ООП можна замінити кількома десятками класів із своїми методами). Попри те, що ця парадигма з'явилась

Інкапсуляція — один з трьох основних механізмів об'єктно-орієнтованого програмування. Йдеться про те, що об‘єкт вміщує не тільки дані, але і правила їх обробки, оформлені в вигляді виконуваних фрагментів (методів). А також про те, що доступ до стану об'єкта напряму заборонено, і ззовні з ним можна взаємодіяти виключно через заданий інтерфейс (відкриті поля та методи), що дозволяє знизити зв'язність1. Таким чином контролюються звернення до полів класів та їхня правильна ініціалізація, усуваються можливі помилки пов'язані з неправильним викликом методу. Оскільки користувачі працюють лише через відкриті елементи класів, то розробники класу можуть як-завгодно змінювати всі закриті елементи і навіть перейменовувати та видаляти їх, не турбуючись, що десь хтось їх використовує у своїх програмах.

64. Одиничне та множинне наслідування в ООП. Ієрархія класів.

При спадкуванні всі атрибути і методи батьківського класу успадковуються класом-нащадком. Спадкування може бути багаторівневим, і тоді класи, що знаходяться на нижніх рівнях ієрархії, успадкують всі властивості (атрибути і методи) всіх класів, прямими або непрямими нащадками яких вони є.

Крім одиничного, існує і множинне спадкування, коли клас успадковує відразу кілька класів (рис. 1, с). При цьому він успадкує властивості всіх класів, нащадком яких вона є. Проте в мові PHP таке спадкування не реалізовано.

При спадкуванні одні методи класу можуть заміщатися іншими. Так, клас транспортних засобів буде мати узагальнений метод руху. У класах-нащадках цей метод буде конкретизований: автомобіль буде їздити, літак - літати, корабель - плавати. Така зміна семантики методу називається поліморфізмом. Поліморфізм - це виконання методом з одним і тим же ім'ям різних дій залежно від контексту, зокрема, від приналежності того чи іншого класу. У різних мовах програмування поліморфізм реалізується різними способами.

Множи́нна спадковість — властивість деяких обʼєктно-орієнтованих мов програмування, в яких класи можуть успадкуватиповедінку і властивості більш ніж від одного суперкласу (безпосереднього батьківського класу). Це

відрізняється від простого спадкування, у випадку якого клас може мати тільки один суперклас.

Мови програмування з підтримкою множинного спадкування: Eiffel, C++, Dylan, Python, Perl, Curl, Common

Lisp (завдяки CLOS), OCaml, Tcl (завдяки Incremental Tcl)[1] та Object REXX (завдяки використанню класів домішок).

Ієрархія класів в інформатиці означає класифікацію об'єктних типів, розглядаючи об'єкти як реалізацію класів (клас схожий на заготовку, а об'єкт - це те, що будується на основі цієї заготовки) та пов'язуючи різні класи відносинами на зразок «успадковує», «розширює», «є його абстракцією »,« визначення інтерфейсу ».

Відносини, встановлені в області об'єктно-орієнтованого проектування та стандартах інтерфейсу об'єктів, визначаються найбільш поширеним використанням, творцями мов (Java, C ++, Smalltalk, Visual Prolog) і комітетами по стандартизації, як наприклад, Object Management Group.

65. Властивість поліморфізму в ООП. Використання поліморфізму при побудові ієрархії класів

Отже, думки про ООП поліморфні: описують одне, сконструйовані порізному, або, навпаки, описують різний, але базуються на чотирьох однакових позиціях. Демократичне начало не властиво області інформаційних технологій, але слід віддати належне: поєднання і спільне існування безлічі думок про одне і те ж - це реальний поліморфізм в дії.

Популярні визначення поліморфізму

ООП - черговий етап розвитку інформаційних технологій. З цим мало хто сперечається, але його основні аксіоми та положення так різняться в частині семантики, що не заслуговують уваги поза їх сукупності.

Поліморфізм-у програмуванні - це здатність надавати один і той же інтерфейс для різних базових форм (типів даних).

Поліморфізм - можливість об'єктів мати різну реалізацію.

Поліморфізмом називається здатність функції

Класика (від творця С/С++): «один інтерфейс - багато реалізацій».

Параметричний поліморфізм означає

Поліморфізм - положення теорії типів

Абстракція неможлива без інкапсуляції і спадкування, як неможливий поліморфізм без успадкування

Можна погодитися, що все це відноситься до одного і того ж: але форма вираження думки, сутність і зміст - не подібні. Але щось спільне все ж є.

Поліморфізм - це виконання методом з одним і тим же ім'ям різних дій залежно від контексту, зокрема, від приналежності того чи іншого класу. У різних мовах програмування поліморфізм реалізується різними способами.

При побудові складній ієрархії6, для забезпечення поліморфізму програмісти часто змушені вводити методи в класи верхнього рівня, навіть якщо ці методи ще не визначені для цієї специфічної абстракції. Тут можна було б залишити порожні методи, але багато ГО мови пропонують такий специфічний механізм, як визначення абстрактних методів, тобто методів без реалізації. Класи, що мають хоча б один абстрактний метод, часто називається абстрактним класом.

C + +: У C + + абстрактні методи або чисто віртуальні функції виходять додаванням так званого чистого описувач (= 0) у визначення методу. Абстрактні класи є просто класами з одним або більше абстрактним методом (або успадковують їх). Ви не можете створити об'єкт абстрактного класу.

OP: Object Pascal для виділення цих методів використовує ключове слово abstract. Крім того, абстрактними класами є класи, які мають або успадковують абстрактні методи. Ви можете створити об'єкт абстрактного класу (хоча компілятор видасть попередження). Це піддає ризику програму викликати абстрактний метод, що призведе до генерації помилки часу виконання і завершення програми.

66.Абстрактні класи та інтерфейси в ООП

Воб'єктно-орієнтованому програмуванні абстрактний клас – це базовий клас, від якого не можна створити екземпляру. На практиці абстрактні класи реалізують один з принципів ООП – поліморфізм. В абстрактному класі можна описати (або не визначити) абстрактні методи та властивості. Абстрактний метод не реалізовується в класі в якому описується, але має бути реалізований в неабстрактному нащадку. Абстрактні класи вважаються найбільшими узагальненими абстракціями, тобто відношення об'єму описів до об'єму реалізації найбільше. В деяких мовах заборонено створювати екземпляри абстрактних класів, в інших дозволяється (наприклад, Delphi), але звернення даного екземпляра, до абстрактного методу викличе помилку. В багатьох мовах дозволяється оголошувати будь який клас абстрактним навіть, якщо в ньому нема абстрактних методів (наприклад, Java). Для того щоб заборонити створення екземплярів. Абстрактний клас можна розглядати, як інтерфейс для сімейства класів, які ним породжені, але на противагу класичному інтерфейсу, абстрактний клас може містити реалізацію методів та властивості. Абстрактні методи переважно є і віртуальними, через це поняття «абстрактний» та «віртуальний» інколи плутають