Перегрузка оператора присваивания. Пример
Он позволяет избежать той же ситуации, которая возникает в предыдущем случае, но уже при выполнении присваивания. Если оператор = не перегружен, то выполняется поэлементное копирование полей объекта. Форма записи стандартная:
Имя_класса& Имя_класса::operator=(const Имя_класса&).
Пример
String& String::operator=(const String& st)
{
if (this==&st) return *this;//защита от присваивания самому себе
delete[] str;//удаление предыдущей строки
len = st.len;
str = new char[len+1];
strcpy(str,st.str);
return *this;
}
Нужна и вторая версия оператора присваивания, чтобы можно было присвоить объекту непосредственно строку и не применять конструктор (неявно) для преобразования из строки в String:
String& String::operator=(const char* s)
{
delete[] str;//удаление предыдущей строки
len = strlen(s);
str = new char[len+1];
strcpy(str,s);
return *this;
}
Теперь можно выполнить:
String name,num;
char temp[40];
…
name = temp;//используется конструктор копирования
…
num = name;//если его нет, то обычный конструктор
delete[] str; в начале нужен, чтобы освободить память, которую занимала строка объекта, расположенного слева от оператора =. |
Вопросы для самоконтроля
· Какие конструкторы применяются для выполнения неявных преобразований базовых типов данных или данных некоторого класса в тип, соответствующий классу?
· Перечислите ситуации, когда применяются неявные преобразования базовых типов данных и типов, соответствующих классам?
· Каким образом декларируются функции приведения типов объектов классов к базовым (встроенным в язык) типам данных?
· Каким образом выполняется декларация дружественного, по отношению к некоторому классу, оператора? – за счет чего могут автоматически преобразовываться его аргументы?
· Как выглядят декларации конструкторов копирования?
· Как выполняется копирование в случае отсутствия конструктора копирования?
· В каких ситуациях могут возникать висячие ссылки?
· Как выглядит аргумент метода, реализующего перегрузку оператора присваивания?
Вопросы для самостоятельного изучения
· Выполните перегрузку для оператора «-» для представленного выше класса Time!
· Выполните перегрузку оператора присваивания для представленного выше класса Time!
· Разработайте конструктор копирования для представленного выше класса Time!
Лекция 22. С++: Размещение объектов в heap-памяти и наследование по иерархии классов
Дата добавления: 2016-05-26; просмотров: 1689;