- Створити новий репозиторій (по аналогії з інснуючим) з назвою: programing-FNAME-cpp (
programing-davydov-cpp
): - Додати до репозиторію файли:
.clang-format
з директоріїlab-cpp00
репозиторіюsample_project
.clang-tidy
з директоріїlab-cpp00
репозиторіюsample_project
- модульні тести потрібно (пере)робити за допомогою Google Test Framework: https://google.github.io/googletest/, при цьому, рекомендовано проінсталювати
googletest
пакет та використовувати наступні опції при компіляції тестів-lgtest -lgtest_main
. Приклад переробленого тесту наведено уlab-cpp00
проектуsample_project
репозиторію.
└── lab-cpp-01
├── Doxyfile
├── Makefile
├── README.md
├── doc
│ └── lab-cpp-01.md
├── test
│ └── test.cpp
└── src
├── entity.cpp
├── entity.h
├── list.cpp
├── list.h
└── main.cpp
Для предметної галузі з розділу Розрахункове завдання / Iндивідуальні завдання розробити два класи:
- клас, що відображає сутність "базового класу", у тому числі:
- конструктор за замовчуванням, копіювання та конструктор з аргументами (реалізація конструкторів повинна бути продемонстрована за допомогою списків ініціалізацій);
- деструктор;
- гетери та сетери на поля класу;
- метод виводу об'єкта на екран:
void Phone::print();
- клас, що має у собі динамічний масив об’єктів базового класу та має в собі методи додавання, видалення елемента, отримання елемента по індексу (або ідентифікатору), вивід усіх елементів на екран. Рекомендовані сигнатури методів:
- додавання:
void List::addPhone(const Phone& phone, size_t pos = 0);
- видалення:
void List::removePhone(size_t index);
- отримання по індексу:
Phone& List::getPhone(size_t index);
- виведення усіх елементів:
void List::print();
- метод 1 обходу колекції. Приклад сигнатури такого методу (У наведеному прикладі реалізоване завдання пошуку самого дешевого телефону з заданою діагоналлю (повертається один телефон):
const Phone& List::findCheapestPhone(unsigned float diagonal);
- усі поля "базового класу" повинні бути приватними та мати публічні гетери та сетери (модифікатори доступу), використовувати механізм інкапсуляції;
- усі функції, що не повинні змінювати поля поточного об’єкта, повинні бути константними;
- усі аргументи функцій, що не змінюються, по можливості також повинні бути константними. Якщо їх не можна зробити константними, у такому разі повинно бути обґрунтування цього;
- у класі-списку метод додавання елемента не повинен вводити дані з клавіатури або файлу, а повинен приймати вже готовий об’єкт для додавання. Метод вводу даних має бути відокремленим;
- продемонструвати відсутність витоків пам’яті;
- продемонструвати роботу розроблених методів класу-списку за допомогою модульних тестів.
- конструктори та деструктори повинні мати логіруючі повідомлення.
Студент повинен продемонструвати виклик деструктора та кожного типу конструктора, а також пояснити, коли вони викликаються;
- Що таке клас? Чим він відрізняється від структури?
- Що таке метод? Чим він відрізняється від функції?
- Що таке інкапсуляція?
- Що таке константні методи? Наведіть приклади.
- Як визначити розмір об’єкта у пам’яті?
- Для чого потрібні права доступу?
- Які методи потрібні для доступу до private-атрибутів?
- Для чого потрібні const-методи?
- Коли є смисл у константних методах?
- Чи може бути атрибут константним?
- Для чого потрібні конструктори?
- Які ви знаєте відмінності конструкторів?
- Чи можна перевантажувати конструктори?
- Для чого потрібні деструктори?
- Які відмінності деструктора?
- Що таке конструктор копіювання? Для чого він потрібен?
- Коли викликаються конструктори та деструктор?
- Що таке списки ініціалізації?
- Що таке перевантаження методів?
- Чим визначається виклик перевантажених методів?