Александр Степанов - это создатель STL. Ни добавить, ни отнять. Последние годы он занимается в основном преподаванием и написанием книг.
Недавно я купил его последнюю книгу “Elements of Programming”.
Довольно своеобразная книга. Много математики, приводимой как обоснование тех или иных приемов в программировании (язык, конечно, С++), из-за чего читается немного тяжело. Забавно, я читал многие его публикации до этого, и как-то заметил, что чем дальше, тем больше он использует формальную математику для описания программирования.
Еще интересный факт: в данной книге везде при использовании шаблонов используются концепты, хотя недавно было принято решение, что в C++0x их не будет из-за общей пока недоработанности идеи.
Но вернемся к другим публикациям Степанова.
Одни из мои любимых - Notes for the Programming course at Adobe и Science of C++ Programming.
Например, ставший классикой, его пример на тему итераторов:
if (!v.empty()) { sort(&*begin(), &*v.begin() + v.size()); }
когда спрашивается, почему в данном вполне рабочем примере обязательно нужна проверка v.empty()
и почему нельзя второй аргумент нельзя записать как &*v.end()
?
Но вот что лично мне понравилось, это способ реализации оператора присваивания для класса. Обычно, когда в классе есть конструктор копирования и оператор присваивания, стандартный прием - это сделать закрытую функцию типа clone()
или copy()
, которая умеет правильно копировать класс, если внутренняя его структура нетривиальна, и вызывать эту функцию из конструктора копирования и оператора присваивания, тем самым избегая дублирования кода.
Но Степанов говорит следующее: “…присваивание должно осуществляться вызовом деструктора и последующим конструктором”. То есть надо просто сделать полноценный конструктор копирования, а оператор присваивание реализовать так:
T& T::operator=(const T& x) { if (this != &x) { this->T::~T(); new (this) T(x); } return *this; }
Получается, что старый объект сам себя разрушает, вызвав деструктор (но память под ним не освобождается), а затем оператором new
с явным размещением (память под объект тут уже повторно не распределяется) объект создается снова через конструктор копирования.
В общем, данные pdf-ки - очень интересное чтиво. Причем, Степанов никогда не забывает об эффективности (ибо неграмотное использования возможностей шаблонов элементарно делает программу очень медленной и жадной до ресурсов), и, например, главы про техники перемещения, а не копирования объектов очень познавательны.