
Параметри головної функції 0
Запустити програму на виконання можна не тільки засобами системи програмування або файлового менеджера. Будь-яка операційна система дозволяє запустити програму в так званому командному рядку, або рядку виклику.
У заголовку функції main() можна записати два параметри: перший типу int, другий типу char** або char*[] (тобто вказівник на вказівники на символи). Тоді на початку виконання головної функції значеннями параметрів стають, відповідно, кількість слів у рядку виклику й адреса першого елемента в масиві вказівників на рядки. За традицією, параметри програми мають імена argc (типу int) і argv (типу char**).
int main(int argc, char **argv)
Структури
Зображувати об’єкти, що мають кілька складових частин (компонент), можна у вигляді структур. Розглянемо оголошення імені типу структур для точок.
struct Point { double x; double y; };
Змінна структурного типу називається структурою, а її складові частини – полями. Значенням структури є послідовність значень її полів.
Поля структури, на яку встановлено вказівник, можна ідентифікувати в два способи. Перший використовує операцію взяття адреси *, другий – операцію непрямого доступу зі знаком ->. Наприклад, якщо вказівник Point* p встановлено на деяку змінну, то її поля можна позначити (*p).x, (*p).y або наочніше p->x, p->y. Аналогічно можна присвоїти значення полям структури *p.
Класи
Тип, заданий цілісним виразом, що описує значення й операції типу й забезпечує захист змінних цього типу від недопустимого доступу, у мові С++ називається класом, а змінна цього типу – об’єктом. «Поля-функції» класу називаються методами класу.
Поля-дані й виклики методів класу позначаються однаково – їх вказують після імені об’єкта й крапки. Наприклад, якщо p – ім’я об’єкта типу Point, то вираз p.x позначає поле x об’єкта p, а вираз p.input() – виклик функції input для обробки об’єкта p.
Методи класу створюються в одному екземплярі незалежно від кількості об’єктів у програмі. Отже, метод не є складовою частиною об’єкта.
У виклик методу передається адреса об’єкта, якому належить виклик, як неявний додатковий аргумент. Відповідний неявний параметр методу є вказівником на об’єкт і має ім’я this. За допомогою цього вказівника можна, в разі необхідності, в тілі методу явно позначити об’єкт, якому належить виклик, і його поля. Вираз *this позначає об’єкт, а вирази, наприклад, (*this).x або this->y у методах класу Point – поля об’єкта.
Клас – це, з одного боку, тип даних, для якого задано множину значень і допустимі операції, а з іншого – оголошення, що описує дані та операції (неформально, це опис певного поняття).
Об’єкт, або екземпляр класу, – це змінна типу, що є класом.
Атрибут (класу, об’єкта) – це поле даних, як правило, приховане.
Метод (класу, об’єкта) – це функція, оголошена як поле в класі. Метод може бути відкритим або прихованим.
Член класу – це атрибут або метод. Термін «член класу» – синонім терміну «поле класу».
Інтерфейс класу – це сукупність відкритих методів класу, тобто, неформально, опис, як обробляти об’єкти класу або як взаємодіяти з ними.
Інкапсуляція – це оголошення даних і операцій їх обробки у вигляді цілісної структурної одиниці, яка забезпечує захист даних від будь-якого використання, окрім як за допомогою вказаних операцій, тобто унеможливлює обробку даних за межами цих операцій. Прицип інкапсуляції полягає в організації даних і операцій їх обробки на основі інкапсуляції.
Розділи полів. У класі може бути скільки завгодно розділів, що починаються заголовками public: або private:. Якщо на початку тіла класу жодного з цих заголовків немає, то поля до найближчого заголовку є прихованими.
Схожість і відмінність класів і структур. У структурах, як і в класах, можуть бути поля-функції, що реалізуються як вбудовані або окремо, а також довільна кількість розділів із заголовками public: або private:. Проте, якщо на початку тіла структури жодного з цих заголовків немає, то поля до найближчого заголовка є відкритими.
Конструктори й деструктор
Компілятор, створюючи «машинний варіант» класу, додає до методів, оголошених у класі, ще чотири – стандартний конструктор, стандартний конструктор копії, метод присвоювання й стандартний деструктор.
Конструктор – це метод класу, що неявно викликається відразу після того, як створено об’єкт цього класу.
Деструктор, – це метод класу, що неявно викликається перед тим, як знищується об’єкт цього класу.
Якщо створюється глобальний об’єкт, тобто означений за межами функцій програми, стандартний конструктор надає атрибутам об’єкта нульові значення. Якщо ж об’єкт є локальним у функції, то його атрибути не ініціалізуються, тобто залишаються «випадковим сміттям».
Стандартний конструктор викликається неявно, коли виконується інструкція означення об’єкта без його ініціалізації, наприклад, інструкція Point p;.
Стандартний конструктор копії копіює значення всіх атрибутів вже існуючого об’єкта в створюваний.
Конструктор копії викликається в таких ситуаціях:
1. Оголошений об’єкт ініціалізується за допомогою іншого об’єкта, наприклад, Point p2=p1, p3(p1);.
2. Параметр-значення функції є змінною, яка існує протягом виконання виклику функції. На початку виконання виклику ця змінна створюється й ініціалізується значенням аргументу, вказаного у виклику. Якщо параметр є об’єктом, ці дії виконує конструктор копії.
Стандартний деструктор викликається, перед тим, як об’єкт знищується. Це відбувається, коли закінчується виклик функції, а об’єкт є локальним у ній, або коли закінчується виконання програми, а об’єкт є глобальним.
У класі можна означати власні конструктори, в яких описуються дії, зв’язані, головним чином, з ініціалізацією атрибутів об’єкта.
Дії, описані в конструкторі, виконуються після створення об’єкта.
Конструктор оголошується як відкритий метод класу. Його іменем є ім’я класу, а в заголовку немає типу значень, що повертаються. Можна означити кілька конструкторів з різними заголовками.
Приклад. Додамо до класу Point, означеного вище, три конструктори, що забезпечують три різні форми ініціалізації об’єктів-точок.
class Point {
private : double x, y;
public:
Point(); /*1*/
Point(double); /*2*/
Point(double, double); /*3*/
...
};
Ім’я атрибуту й ініціалізуючий вираз у дужках утворюють ініціалізатор.
Якщо в класі оголошено хоча б один конструктор, то стандартний конструктор не створюється. Звідси, якщо в класі немає конструктора без параметрів, то звичайне оголошення об’єкта, як Point p;, стає помилковим.