Умные указатели
Забудьте все, что вам известно о С и примитивных операторах ->, и взгляните на проблему под новым углом. Рассмотрим следующий фрагмент:
class Foo {
public:
void MemberOfFoo();
};
Foo* aFoo = new Foo;
aFoo->MemberOfFoo();
Представьте, что встроенный оператор -> применяется к встроенному классу указателя - адресу, хранящемуся в aFoo. C++ предоставляет такой оператор для любого объекта, имеющего тип указателя на структуру, указателя на класс или указателя на объединение. Встроенные операторы -> осуществляют доступ к членам, указанным справа (в данном примере MemberOfFoo()). Фактически вы ссылаетесь на члена объекта (Foo) с помощью другого объекта и его оператора ->. То, что другой объект является указателем - всего лишь частный случай; вместо него мог бы использоваться ваш собственный класс с написанным вами нестандартным оператором ->. Именно так следует подходить к оператору -> в C++, поскольку он, как и все остальные операторы (кроме оператора .), может перегружаться. Синтаксис был в общих чертах обрисован в главе 2, однако его последствия для программирования огромны, и их обсуждение займет эту и несколько следующих глав.