Як ми вже встановили, якщо перетворення типів передбачене в класі призначення, то слід використовувати конструктор з одним аргументом, а якщо у вихідному класі – то використовується операція перетворення. Який саме спосіб слід вибирати в конкретних випадках? Якщо обидва класи повністю доступні, то можна вибрати будь-який. Але так буває не завжди. Якщо ми купуємо чужу бібліотеку класів, то можемо не мати доступу до її вихідних файлів. Якщо ми будемо використовувати об’єкт такого класу в якості вихідного у перетворенні, то можемо дістати доступ лише до класу призначення, тому використовуватимемо конструктор з одним аргументом. Якщо ж об’єкт призначення належить бібліотечному класу, то ми повинні виконувати операцію перетворення у вихідному класі.
«Підводні камені» перезавантаження операцій і перетворення типів
Перезавантаження операцій і перетворення типів дає нам змогу створити, по суті, нову мову. Нехай a, b, c - об’єкти визначеного користувачем класу, а операція + перезавантажена, при цьому рядок
a=b+c;
може означати що-небудь відмінне від того, що було б, якби a,b, c належали до якогось із основних типів. Можливість перевизначення вбудованих блоків мови добра тим, що ми моджемо зробити лістінг програми більш зрозумілим і читабельним. Але можливий і інший результат, коли наш лістінг стане, навпаки, менш зрозумілим і складнішим. Приведемо кілька рекомендацій з цього приводу.
Використання схожих значень
Використовуйте перезавантаження операцій для виконання дій, які можна виконати за допомогою основних типів даних. Наприклад, ми можемо перезавантажити знак + для виконання віднімання (матриць, векторів, многочленів і т.д.), але це не зробить наш лістінг зрозумілішим.
Перезавантаження операції передбачає, що це має сенс для виконання певних дій з об’єктами певного класу. Якщо ми збираємося перезавантажити операцію + класу Х, то результат додавання двох об’єктів цього класу повинен хоча б нагадувати суму.
Вивчаючи цю тему, ми перезавантажили операцію + для об’єктів класу Distance і для рядкового типу String, але навряд чи є сенс додавати об’єкти схожі на раніше використовуваний тип TStudent.