Есть такое понятие - explicitly shared (явное совместное использование данных). Оно означает, что созданные копии объекта (с помощью конструктора копирования или оператором присваивания) ссылаются на одни и те же данные. Когда данные модифицируются с помощью одного объекта, изменения будут видны в другом.
Не следует путать явное совместное использование данных (explicitly shared) с неявным совместным использованием данных, именуемое в английской технической литературе как implicitly shared. Неявное совместное использование данных лишено вышеописанной проблемы, так как в своей основе имеет механизм "копирование при изменении" (copy-on-write).
Избежать проблемы совместного использования данных для объектов типа explicitly shared можно путем полного копирования объекта. Обычно такой метод называется copy() или clone().
Например, в Qt класс QDomNode создает explicitly shared объект. Его копирование через оператор = будет приводить только к тому, что вторая переменная будет работать с теми же данными что и первая. Для создания глубокой копии объекта класса QDomNode используется метод cloneNode().
А класс QMap, хоть и является контейнерным классом, но имеет конструкцию своего объекта как implicitly shared. И поэтому когда происходит присвоение QMap другой переменной, то обе переменные начинают работать с одними и теми же данными (поэтому присвоение быстрое). Но как только в одной из переменных начнется изменение данных, перед этим изменением произойдет полное копирование данных, и каждая переменная будет работать со своим набором данных.
Implicity share - это очень мощный и удобный механизм, позволяющий работать с большими объектами как с обычными переменными, передавая их по значению. Если объект не будет изменяться, то практически никакого оверхеда на работу c таким объектом нет. Если объект где-то изменяется, то надо понимать что в этот момент один раз произойдет копирование данных, чтобы переменная начала указывать на собственную копию данных. Но если окажется так, что больше никакие переменные кроме текущей к моменту изменения объекта не указывают на данный объект, то копирования данных не будет происходить, так как в этом случае это делать нет необходимости и изменения будут вноситься прямо в данные.