Главная » C++ энциклопедия » П » Перегрузка оператора =
Категория: C++ энциклопедия » П
  • 0

22 янв 2012

Автор: admin

Перегрузка оператора = практически не отличается от перегрузки всех остальных операторов. Пока нас интересует сигнатура оператора =, которая выглядит так: Х& X::operator=(const X&).
class String { 
private:
char* s ;
public:
String(char*);
~String();
String(const S tring&); // В озможно, тоже решает проблему
String& operator=(const String&);
void Dump(ostream& os);
};
String::String(char* s) : s(NULL)
{
if (str == NULL) { // NULL означает пустую строку
s = new char[1];
*s = ‘\0’;
}
else {
s = new char[strlen(str) + 1];
strcpy(s, s tr);
}
}
String::~String()
{
delete s ;
}
String::String(const String& s1) : s(NULL)
{
s = new char[strlen(s1.s) + 1];
strcpy(s, s 1.s);
}
String& String::operator=(const String& s1)
{
if (this == &s1) return *this;
delete s ; // У ничтожить предыдущее значение
s = new char[strlen(s1.s) + 1];
strcpy(s, s 1.s);
return * this;
}
void String::Dump(ostream& os)
{
os << “\”” << s << “\””;
}

Конструктор копий и оператор = вместо простого копирования адреса теперь создают копию новой строки. Деструктор стал безопасным, и миру ничего не угрожает.
Ниже показан обобщенный вид оператора =, который стоит занести в долговременную память (не компьютерную, а вашу собственную):
  1. Убедитесь, что не выполняется присваивание вида x=x;. Если левая и правая части ссылаются на один объект, делать ничего не надо. Если не перехватить этот особый случай, то следующий шаг уничтожит значение до того, как оно будет скопировано
  2. Удалите предыдущие данные
  3. Скопируйте значение
  4. Возвратите указатель *this.

Оператор = возвращает *this, чтобы стало возможным вложенное присваивание вида а=b=с. В C++,
как и в С, значением этого выражения является присваиваемая величина. Выражение интерпретируется
справа налево, как а=(b=с).

А теперь — плохие новости. Как и в случае с конструкторами копий, при перегрузке оператора = C++ умывает руки и отправляется домой. Если вы перегрузили оператор =, то на вас ложится ответственность за выполнение присваивания для переменных и базовых классов; по умолчанию
базовые классы и переменные левостороннего объекта остаются без изменений.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.