Правила для конструкторів

Фактично синтаксис передачі аргументу конструктору з параметрами є скороченою формою запису наступного виразу:

Dot A = Dot ( 'A'. 3. 4);

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

На відміну від конструктора, деструктор не може мати параметрів. Зрозуміло, чому це зроблено: нема чого передавати аргументи удаляемому об'єкту.

Наведемо правила, які існують для конструкторів:

конструктор класу викликається всякий раз, коли створюється об'єкт його класу;

конструктор зазвичай инициализирует дані-члени класу і резервує пам'ять для динамічних членів;

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

клас може мати кілька перевантажених конструкторів;

конструктор не може бути оголошений з модифікатором const. volatile. static або virtual;

якщо в класі не визначений конструктор, компілятор генерує конструктор за замовчуванням. не має параметрів.

Правила для деструкторов

Для деструкторов існують такі правила: деструктор викликається при видаленні об'єкта;

деструктор зазвичай виконує роботу зі звільнення пам'яті, зайнятої об'єктом;

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

; деструктор не може мати параметрів; деструктор не може повертати значення; деструктор не успадковується; клас не може мати більше одного деструктора;

деструктор не може бути оголошений з модифікатором const. volatile або static;

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

Підкреслимо ще раз: конструктори і деструктори в C ++ викликаються автоматично. що гаран-

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

Список ініціалізації елементів

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

ConstrName (parl. Par2). mem1 (parl). mem2 (par2). ... <…>

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

// конструктор зі списком ініціалізації

Dot (char Name). name (Name). x (0). y (0) <>

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

Конструктори за замовчуванням

C ++ визначає два спеціальних виду конструкторів: конструктор за замовчуванням, про який ми згадували вище, і конструктор копіювання. Конструктор за замовчуванням не має параметрів (або всі його параметри повинні мати значення за замовчуванням) і викликається при створенні об'єкта, якому не задані аргументи. Слід уникати двозначності при виклику конструкторів. У наведеному нижче прикладі два конструктора за замовчуванням є двозначними:

// конструктор за замовчуванням

// конструктор з одним необов'язковим параметром

// може бути використаний як конструктор за замовчуванням

// Використовує конструктор T :: T (int)

// Не вірно; неоднозначність виклику Т :: Т () або Т :: Т (int = 0)

конструктори копіювання

Конструктор копіювання створює об'єкт класу, копіюючи при цьому дані з уже існуючого об'єкта даного класу. У зв'язку з цим він має в якості єдиного параметра константну посилання на об'єкт класу (const Т ) Або просто посилання на об'єкт класу (Т ). Використання першого краще, так як останній не дозволяє копіювати константні об'єкти.

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

Наведемо приклад використання конструктора копіювання:

Схожі статті