Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Перегрузка оператора присваивания




Он позволяет избежать той же ситуации, которая возникает в предыдущем случае, но уже при выполнении присваивания. Если оператор = не перегружен, то выполняется поэлементное копирование полей объекта. Форма записи стандартная:

Имя_класса& Имя_класса::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-памяти и наследование по иерархии классов






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных