Фактично синтаксис передачі аргументу конструктору з параметрами є скороченою формою запису наступного виразу:
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 Т ) Або просто посилання на об'єкт класу (Т ). Використання першого краще, так як останній не дозволяє копіювати константні об'єкти.
Якщо в класі не визначений конструктор, компілятор намагається згенерувати власний конструктор за замовчуванням і, якщо потрібно, власний конструктор копіювання. Ці згенеровані компілятором конструктори розглядаються як відкриті функції-члени. Підкреслимо, що компілятор генерує ці конструктори, якщо в класі не визначений ніякий інший конструктор.
Наведемо приклад використання конструктора копіювання: