This givens an example showing overloading I/O operators (in a very simple way). The complete code for this example can be found in overloadIO.cpp
int main() {
    Point p, q;
    cout << "enter a point: ";
    cin >> p;
    
    cout << "you entered: " << p << endl;
    cout << "enter another point: ";
    cin >> q;
    
    cout << "you entered: " << q << endl;
    return 0;
}
class Point {
    friend ostream & operator<<(ostream & out, const Point & p);
    friend istream & operator>>(istream & in, Point & p);
  public:
    // constructors
    Point(): x(0), y(0) { }
    Point(int a, int b): x(a), y(b) { }
    // accessors
    int getX() const { return x; }
    int getY() const { return y; }
    // mutators
    void setX(int newX) { x = newX; }
    void setY(int newY) { y = newY; }
  private:
    int x, y;
};
ostream & operator<<(ostream & out, const Point & p) {
    out << "(" << p.x << "," << p.y << ")";
    return out;
}
istream & operator>>(istream & in, Point & p) {
    char ch;
    int x, y;
    in.get(ch);
    while (ch == ' ' || ch == '\n' || ch == '\t')
        in.get(ch);
    if (ch != '(') { 
        return in;
    }
    in >> x;         // read in x value
    in.get(ch);
    while (ch == ' ' || ch == '\n' || ch == '\t')
        in.get(ch);
    if (ch != ',') {
        return in;
    }
	
	
    in >> y;         // read in y value
    in.get(ch);
    while (ch == ' ' || ch == '\n' || ch == '\t') 
        in.get(ch);
    if (ch != ')') {
        return in;
    }
    // only after the entire point has been read in successfully do we update p
    p.x = x;
    p.y = y;
    return in;
}