Стаття Копіювання та присвоєння частина перша
Визначення конструктора копій
X(); // Віртуальний деструктор // Конструктор копії та операція присвоєння не визначені // навмисно. Клас містить лише дані, що розміщуються // в стеку, тому зумовлених конструктора копій //і операції присвоєння достатньо. private: int data; char moreData; float no_Pointers; >;
Якщо хоча б одна з названих умов не виконується, слід визначити як конструктор копій, так і операцію присвоєння.
Визначення операції присвоєння
За функціональним призначенням операція присвоєння дуже нагадує конструктор копій. Принципова відмінність полягає в тому, що конструктор копій створює новий (можливо, тимчасовий) об'єкт, а операція присвоєння працює з створеними. Об'єкт, що викликає, є лівим операндом, об'єкт-аргумент - правим. Операція присвоєння також має відповідний синтаксис. Операція присвоєння – це функція-член та одночасно двомісна операція. Отже, до роботи залучено два об'єкти. Перший об'єкт - зухвалий, доступний за вказівником цього, а другий - це аргумент. Як конструктор копій, так і операція присвоєння використовують як аргумент постійне посилання. Для довільного класу X ми маємо наступний синтаксис операції присвоєння:
Привласнення - це операція, отже ми маємо використовувати ключове слово operator та відповідний символ операції. Оскільки C++ допускає ланцюжка присвоювання а = b = с = d; // C++ допускає послідовні присвоювання, так що цю властивість треба зберегти необхідно повертати посилання на об'єкт; в іншому випадку ланцюжок перерветься. Отже, оператор-функція приймає постійне посилання, а повертає посилання на об'єкт.Використання ключового слова const дозволяє працювати як з постійними об'єктами, так і зі змінними.
Визначаючи новий клас, якщо ви вирішили оголосити операцію присвоєння, дотримуйтесь наступних рекомендацій:
- Операція присвоювання має бути членом класу.
- Вона приймає постійне посилання на об'єкт типу того самого класу.
- Вона повертає посилання на об'єкт типу того самого класу.
В операції присвоєння будь-якого класу треба враховувати один важливий момент. Завжди треба перевіряти: чи не присвоюється самому собі. Воно може мати місце у тому випадку, коли об'єкт прямо чи опосередковано викликає операцію присвоювання собі. Пряме присвоєння може виглядати так:
Навіщо C++ вимагає визначення цих функцій-членів?
Вам слід розуміти, що насправді викликається, коли і чому. Це одна з тих особливостей, завдяки яким C++ важче і цікавіше, ніж С. У попередньому розділі ми дійшли висновку, що не варто визначати операцію присвоєння без конструктора копій і навпаки. Отже, напрошується висновок, що основні рекомендації для операції присвоєння справедливі також конструктора копій.
При написанні статті використані матеріали з книг P.Kimmel Using Borland C++ 5 Special Edition переклад BHV - С.Петербург 1997
C++. Оксамитовий шлях Марченко О.Л. Центр інформаційних технологій www.citmgu.ru
Thinking in C++, 2nd ed. Volume 1 2000 by Bruce Eckel
Якщо вам цікаво, чи виникають питання пишіть, розберемося. Сергій Малишев (aka Михалич).