BBB » 24 окт 2007, 10:18
Если оператор копирования для класса не определен, то "по умолчанию" при использовании в тексет присвоения одного экземпляра класса другому присиходит банальное копирование всех полей. Если поля класса, скажем, числа или имеют тип класса, в котором определен оператор копирование, то ничего страшного не произойдет.
Но если, скажем, в экземпляре класса есть указатель на какуе-то динамическую область памяти, то это значение также будет просто скопировано, и два экземпляра класса будут ссылаться на одну и ту же область памяти. Что может привести к очень печальным последствиям (например, при удалении одного из экземпляров он, скорее всего, освободит эту динамическую память, а второй экземпляр будет по-пежнему ссылаться уже "в никуда").
В подобных случаях в операторе присвоения делается выделение (или перевыделение памяти и копирование ее содержимого из первого экземпляра во второй).
PS. Кстати, есть еще такое понятие как
copy constructor. Где-то в чем-то близкое оператору присвоения, но, все-таки, совсем другое
Если оператор копирования для класса не определен, то "по умолчанию" при использовании в тексет присвоения одного экземпляра класса другому присиходит банальное копирование всех полей. Если поля класса, скажем, числа или имеют тип класса, в котором определен оператор копирование, то ничего страшного не произойдет.
Но если, скажем, в экземпляре класса есть указатель на какуе-то динамическую область памяти, то это значение также будет просто скопировано, и два экземпляра класса будут ссылаться на одну и ту же область памяти. Что может привести к очень печальным последствиям (например, при удалении одного из экземпляров он, скорее всего, освободит эту динамическую память, а второй экземпляр будет по-пежнему ссылаться уже "в никуда").
В подобных случаях в операторе присвоения делается выделение (или перевыделение памяти и копирование ее содержимого из первого экземпляра во второй).
PS. Кстати, есть еще такое понятие как [i]copy constructor[/i]. Где-то в чем-то близкое оператору присвоения, но, все-таки, совсем другое :)