Konstruktor kopiujący nie jest Ci potrzebny, bo klasa definiuje taki automatycznie. Tego typu konstruktor przydaje się gdy w obiekcie jest zaalokowana jakaś pamięć (mamy wskaźnik do czegoś) i kopiujemy to coś, zamiast kopiować wskaźnik.
Dlaczego wyświetla 0? To proste. Prześledź co się dzieje.
Rectangle kopia(5,52); - tworzy obiekt Rectangle i używa pierwszego konstruktora, czyli ustawia a na 5 oraz b ma 52.
cout << kopia.area() << endl; - Wyświetla pole, a więc width * height obiektu kopia. Width i height nie są ustawione, więc nic dziwnego, że wynik jest równy 0. Przecież konstruktor nie ustawia width oraz height tylko a oraz b.