> Complex (double i_re = 0, double i_im = 0)
: re (i_re), im (i_im)
{}
.// Конструктор копіювання (const Complex & obj)
{= obj.re; = obj.im;
}: re, im;
};
Конструктор копіювання не має обов'язкових аргументів. Використовується при створенні масивів об'єктів, викликаючи для створення кожного екземпляра. У відсутність явно заданого конструктора за замовчуванням його код генерується компілятором (що на початковому тексті, природно, не відбивається). p align="justify"> Конструктор, аргументом якого є посилання на об'єкт того ж класу. Застосовується в C + + для передачі об'єктів у функції за значенням. p align="justify"> Конструктор копіювання в основному необхідний, коли об'єкт має вказівники на об'єкти виділені в купі. Якщо програміст не створює конструктор копіювання, то компілятор створить неявний конструктор копіювання, який копіює покажчики як є, тобто фактичне копіювання даних не відбувається і два об'єкти посилаються на одні й ті ж дані в купі. Відповідно спроба зміни В«копіїВ» зашкодить оригінал, а виклик деструктора для одного з цих об'єктів при подальшому використанні іншого призведе до обігу в область пам'яті, вже не належить програмі. p align="justify">. Аргумент повинен передаватися саме за посиланням, а не за значенням. Це випливає з колізії: при передачі об'єкта за значенням (зокрема, для виклику конструктора) потрібно скопіювати об'єкт. Але для того, щоб скопіювати об'єкт, необхідно викликати конструктор копіювання. p align="justify">. Конструктор, що приймає один аргумент. Задає перетворення типу свого аргументу в тип конструктора. Таке перетворення типу неявно застосовується тільки якщо воно унікальне. p align="justify"> Конструктор не буває віртуальним в сенсі віртуального методу - для того, щоб механізм віртуальних методів працював, потрібно запустити конструктор, який автоматично налаштує таблицю віртуальних методів даного об'єкта.
«³ртуальними конструкторамиВ» називають схожий, але інший механізм, присутній у деяких мовах - наприклад, він є в Delphi, але немає в C + + і Java. Цей механізм дозволяє створити об'єкт будь-якого заздалегідь невідомого класу за двох умов:
В· цей клас є нащадком якогось наперед заданого класу (в даному прикладі це клас TVehicle);
В· на всьому шляху наслідування від базового класу до створюваного ланцюжок перевизначення не обривати. При перевизначенні віртуального методу синтаксис Delphi вимагає ключове слово overload, щоб стара і нова функції з різними сигнатурами могли співіснувати, override для перевизначення функції або reintroduce для завдання нової функції з тим же ім'ям - остання неприпустимо.