Для того, чтобы перегрузить оператор извлечения — экстрактор, используется тот же самый общий подход, что и для перегрузки операторов вставки — инсертеров. Например, следующий экстрактор осуществляет ввод трехмерных координат. Обратим внимание, что он также осуществляет подсказку пользователю.
// получение трехмерных значений - экстрактор
istream &operator>>(istream &stream, three_d &obj)
{
cout << "Enter X Y Z values, separating each with a space: " ;
stream >> obj.x >> obj.y >> obj.z;
return stream;
}
Экстрактор должен возвращать ссылку на объект типа istream. Первым параметром должна быть ссылка на объект типа istream. Вторым параметром служит ссылка на объект, принимающий ввод. Поскольку это именно ссылка, то второй аргумент может быть модифицирован при вводе информации.
Общая форма экстрактора имеет вид:
istream &operator>> (istream &поток, тип_класса &объект)
// код экстрактора
return stream;
}
Следующая программа демонстрирует экстрактор для объекта типа three_d:
#include <iostream.h>
class three_d {
int x, y, z; // трехмерные координаты
public:
three_d(int a, int b, int c) { x=a; y=b; z=c; }
friend ostream &operator<<(ostream &stream, three_d obj );
friend istream &operator>>(istream &stream, three_d &obj);
};
// вывод координат X, Y, Z (оператор вставки для three_d)
ostream &operator<<(ostream &stream, three_d obj)
{
stream << obj.x << ", ";
stream << obj.y << ", ";
stream << obj.z << "\n";
return stream; // возврат потока
}
// получение трехмерных значений - экстрактор
istream &operator>>(istream &stream, three_d &obj)
{
cout << "Enter X Y Z values, separating each with a space: ";
stream >> obj.x >> obj.y >> obj.z;
return stream;
}
int main()
{
three_d a(1, 2, 3);
cout << a;
cin >> a;
cout << a;
return 0;
}
Подобно функциям вставки, функции извлечения не могут быть членами класса, на элементах которого они оперируют. Как показано в примере, они могут быть друзьями или просто независимыми функциями. За исключением того, что экстрактор должен возвращать ссылку на объект типа istream, внутри экстрактора можно делать все, что угодно. Однако для лучшей структуризации программы и ее ясности лучше всего ограничить эти действия только операциями ввода.