Операторы перегружены правильно.
А вот и нет. Ваша ошибка
std::istream& operator>>(std::istream& s, Pnt& p) // убрать const!
Не обязательно, но можно.
explicit Pnt(int s) {…} // добавить explicit!
Что получается? Мы пытаемся считать в неизменную p.a. Прямое
s >> p.a;
не подходит — поле-то неизменное. И тут, как ни странно, находится цепочка: создать временный Pnt и снова вызвать саму себя!
Добавить explicit: запрещаем вызывать этот конструктор неявно.
Убрать const: расфиксировать p.a.
Также у вас ошибка в перегрузке операции «присвоить».
Pnt& operator=(const int a) {
this->a = a;
return *this; // ну забыл!
}
Насчёт explicit. Конструкторы с одним параметром вообще стоит делать explicit всегда, когда объект семантически отличен от параметра. Например, VeryLongInt(10) или Complex(10) — это та же десятка, и explicit можно опустить. А Vector(10) — динамический массив из 10 элементов ≠ десятке, тут explicit нужен.