есть только один экземпляр, и предоставляет к нему глобальную точку доступа. • Примеры: • Журналирование действий (log). Один-единственный журнал. • Одна-единственная оконная система. • Один-единственный системный таймер. • …
void f(Optimized::String &s) {! char &rc = s[0]; // reference to the 1st char! Optimized::String s2(s); // take a copy of the string! rc = 'x'; // oops: also modifies s2!! } FAIL!
копирует буфер, но и помечает его неразделяемым. • Пометка действует до первой операции, изменяющей строку (после нее ссылки все равно можно считать недействительными).
указателей в конструкторе и не только (лечится с помощью smart pointer). • Неявное преобразование типов (лечится с помощью explicit). • Корректная реализация перегрузки операторов.