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


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

Имя_класса& Имя_класса::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; просмотров: 1596;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.