Операторы перегружены правильно.
А вот и нет. Ваша ошибка
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 нужен.