Перевизначені оператори
Перевизначені оператори використовуються також для збереження семантики мови С++. Як Ви пам’ятаєте із попередньої роботи наступна операція приводила до помилки виконання програми:
CSmsMessage smsMessage( "message text", "1234567" );
CSmsMessage anotherMessage( "another text", "4567890" ); anotherMessage = smsMessage; // ПОМИЛКА присвоєння покажчиків
Причиною помилки було звичайне побайтове копіювання даних у структурі, тобто, після цієї операції, покажчики показували на одні і ті ж області даних, а при виклику деструктора двічі була спроба вивільнити пам’ять під однією областю даних.
Саме для цих задач і щоб запобігти небажаному копіюванню використовуються перевизначені оператори, у даному випадку присвоєння.
Оператор може бути визначений наступним чином:
public:
/**
*Перевизначений оператор для присвоєння даних об'єкту
*@param aSmsMessage Об’єкт повідомлення
*@return Посилання на самого себе для збереження семантики А=Б=В;
*/
CSmsMessage& operator=(const CSmsMessage& aSmsMessage);
Реалізація такого оператору може мати наступний вигляд:
CSmsMessage& CSmsMessage::operator=(const CSmsMessage& aSmsMessage)
{
SetReceiver( aSmsMessage.Receiver() ); SetText( aSmsMessage.Text() );
return *this;
}
Таким чином, видно, що в самому операторі виконується копіювання даних. Зверніть увагу, що оператор повертає посилання на свій об’єкт. Це потрібно для використання семантики мови С++ для оператора присвоєння А=Б=В=Д;
Завдання на лабораторну роботу
Створити новий клас і визначити оператор += для накопичення існуючих об'єктів. Визначити клас Utils із допоміжною функцією визначення максимуму із пари об'єктів
Згідно індивідуального завдання визначити класи за варіантами, розробити програму, що демонструє використання ваших класів.
|
|
Індивідуальне завдання |
№ |
Тематика |
Класи |
1 |
Комп’ютер |
Визначити метод Utils::Max для обробки ціни |
|
|
моніторів |
№ |
Тематика |
Класи |
2 |
Дім |
Визначити метод Utils::Min для обробки площи |
|
|
будівль. |
3Місто-вулиця-дім. Визначити метод Utils::Max для обробки площи
|
|
міст. |
4 |
Комп’ютерна мережа |
Визначити метод Utils::Sum для обробки вартості |
|
|
кабеля. |
5 |
Бібліотека |
Визначити метод Utils::Sum для обробки |
|
|
загального об'єму фондів бібліотек. |
6 |
Кімната |
Визначити метод Utils::Max для обробки площи |
|
|
кімнат. |
7 |
Шафа |
Визначити метод Utils::Max для обробки вартості |
|
|
замків. |
8 |
Автомобіль |
Визначити метод Utils::Max для обробки вартості |
|
|
двигуна. |
9 |
Операційна система |
Визначити метод Utils::Min для обробки часу |
|
|
написання файлової системи. |
10 |
Віконний додаток |
Визначити метод Utils::Max для обробки площи, |
|
|
що займає елемент управління на екрані. |
11 |
Планета, політична |
Визначити метод Utils::Max для обробки площи |
|
карта світу. |
океанів. |
12 |
Сонячна система |
Визначити метод Utils::Min для обробки ваги |
|
|
планет. |
13 |
Група факультету |
Визначити метод Utils::Min для обробки |
|
|
екзаменаційних оцінок. |
14 |
ВНЗ |
Визначити метод Utils::Max для обробки стажу |
|
|
роботи викладачів. |
15 |
Деканат |
Визначити метод Utils::Max для обробки стажу |
|
|
роботи працівників деканату. |
Література
1.Г. Буч. Объектно – ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./ Пер. с англ. – М.: "Издательство Бином". 1998 г. – 560 с., ил.
2.Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное программирование: Практикум. – СПб.: Питер,2004 -288 с.
3.Павловская Т.А., Щупак Ю.А. С++. Структурное программирование: Практикум. – СПб.: Питер,2003 -240 с.
4.Павловская Т.А.С/С++ Программирование на языке высокого уровня. – СПб.: Питер,2007 -461 с.
5.Х.М.Дейтел., П.Дж.Дейтел. Как программировать на Си++. М .: ЗАО БИНОМ, 1999, 1000 с.
