POV: у вас есть структура/класс, в который вы хотите добавить возможности ввода-вывода, но вы не знаете, как это сделать.

C++ позволяет переопределить операторы «››» и «‹‹», соответствующие входным и выходным потокам соответственно.

Давайте построим пример; Структура Point содержит два значения, x и y. Он печатает информацию о себе с помощью функции cout при создании.

struct Point {
  int x, y;
  Point(int _x, int _y): x(_x), y(_y) {
    std::cout << "Created point with coordinates: " << *this << "\n";
  };
};
int main() {
  Point p(123, 456);
  return 0;
}

Выполнение этого кода прервется, потому что наш выходной поток не знает, как обрабатывать нашу пользовательскую структуру данных. Мы можем переопределить оператор <<, чтобы четко определить желаемое поведение.

friend ostream& operator<<(ostream& os, const Point& point) {
  return os << point.x << ' ' << point.y;
}

Добавление этой функции класса приведет к тому, что cout или любая другая операция потоковой передачи вывода будет печатать координаты x и y точки с разделителем-пробелом.

Обратите внимание, что мы объявляем наше переопределение как «функция друга». Выходной поток будет там, где вызывается эта функция, а не внутри нашего класса.

— — —

Теперь предположим, что мы хотим прочитать координаты точки из источника ввода, например, аргументы, прочитанные через CLI. Мы могли бы сделать это, напрямую сканируя отдельные числа x и y, но нам нужно более элегантное решение.

struct Point {
  ...
};
int main() {
  Point p;
  cin >> p;
  return 0;
}

Этого можно добиться, переопределив оператор >>. Реализация почти такая же, как и для переопределения оператора <<. Еще раз обратите внимание, что это функция друга; в этом случае функция будет вызываться из класса istream.

friend istream& operator>>(istream& is, Point& point) {
  return is >> point.x >> ' ' >> point.y;
}

Собрав все это вместе, наш последний пример выглядит так:

struct Point {
  int x, y;
  friend ostream& operator<<(ostream& os, const Point& point) {
    return os << point.x << ' ' << point.y;
  }
  friend istream& operator>>(istream& is, Point& point) {
    return is >> point.x >> ' ' >> point.y;
  }
  Point(int _x, int _y): x(_x), y(_y) {
    std::cout << "Created point with coordinates: " << *this << "\n";
  };
};
int main() {
  Point p;
  std::cin >> p;
  std::cout << "Point coordinates: " << p;
  
  return 0;
}

Вот и все, все готово. Удачного кодирования!