C++ Программирование в среде С++ Builder 5

         

Операция присваивания


Операция присваивания — это функция-элемент класса с именем operator=, которая принимает в качестве своего единственного параметра ссылку или константную ссылку на объект данного класса. Она вызывается компилятором, когда существующему объекту присваивается другой объект. Если операция присваивания не предусмотрена, компилятор генерирует ее по умолчанию. В этом случае при присваивании будет выполняться поэлементное (как говорят, поразрядное) копирование данных объекта.

Как конструктор копии, так и операция присваивания выполняют, по видимости, одинаковые действия. Однако конструктор копии вызывается при инициализации вновь создаваемого объекта, в то время как операция присваивания служит для изменения содержимого существующих объектов.

Вот пример класса с операцией присваивания:

class Time { int hr, min;

public:

Time(int h, int m): hr(h), min (m) {}

Time &operator=(const Times); // Операция присваивания.

};

Time &Time::operator=(const Time &src)

{

if(&src == this) // Проверка на самоприсваивание.

error("Self assignment!");

hr = src.hr;

min = src.min;

}

return *this; // Возвращает ссылку на свой объект.

int main() {

Time start (17,45);

Time current (18, 0);

start = current; // Вызывает operator=.

return 0;

}

Здесь, кстати, показан прием проверки на самоприсваивание, позволяющей предотвратить присваивание объекта самому себе.

Обычно операцию присваивания определяют так, чтобы она возвращала ссылку на свой объект. В этом случае сохраняется семантика арифметических присваивании, допускающая последовательные присваивания в выражении (т. е. с = b = а;).

Параметры конструктора копии и операции присваивания могут иметь тип либо имя_класса&, либо const имя_класса&. Последнее предпочтительнее, так как простая ссылка на класс не позволяет копировать константные объекты.

Если класс содержит указатели или ссылки, может быть целесообразным, как и в случае конструктора копии, запретить присваивание объектов, объявив операцию присваивания в закрытом разделе класса.



Содержание раздела