Пам’ятаймо: якщо ми перевизначили оператор присвоювання, хто-небудь помилково зможе використати його для присвоювання об’єктів самим собі:
alpha=alpha;
Якщо перезавантажений = не передбачить і не заблокує такої ситуації, програма, найвірогідніше, зависне – таке, наприклад, трапилося б з програмою 13.21. Проблема полягає в тому, що, згідно з кодом перезавантаженої операції присвоювання, цей оператор видаляє об’єкт strCount, якщо вважає, що цей об’єкт є єдиним, що використовує strCount. Присвоювання об’єкту самому собі впевнить оператор у цьому факті, хоча насправді ніхто і не збирався видаляти якісь об’єкти.
Щоб все привести до порядку, потрібно ввести перевірку на присвоювання самому собі на початку роботи кожного перезавантаженого =. В більшості випадків це робиться шляхом порівняння адрес об’єктів, що стоять справа і зліва від знаку рівності. Зрозуміло, що, раз адреси рівні, отже, здійснюється присвоювання об’єкту самому собі і необхідно негайно повернутися з цієї функції. Наприклад, в програму 13.21 з цією метою можна вставити таку перевірку:
if(this==&S)
return *this;
в початок функції operator=(). Це повинно розв’язати проблему, яка виникла.