Нет магии. Есть простой БАГ. Итак, давайте использовать трассировку: проследить каждый вызов мутатора. Убедитесь, что никто не может получить доступ к полю _ID другим способом, кроме как через вызов мутатора. Также вызывается конструктор трассировки, конструктор копирования, оператор присваивания копии и деструктор.
Затем запустите свой код и следите за журналом трассировки.
Я уверен, что все станет ясно в вашем случае.
ПРИМЕЧАНИЕ: если ваша реализация пропускает некоторые из функций-членов, упомянутых выше, вы должны определить их с помощью тел, состоящих только из вызова трассировщика.
Вы не должны позволять компилятору генерировать какие-либо неявные функции-члены, чтобы быть уверенным, что вы полностью контролируете свой класс и, в частности, поле _ID
.