Perché non utilizzare i puntatori per tutto in C ++?

Supponiamo che io definisca qualche class:

class Pixel { public: Pixel(){ x=0; y=0;}; int x; int y; } 

Quindi scrivi del codice usando questo. Perché dovrei fare quanto segue?

 Pixel p; px = 2; py = 5; 

Provenendo da un mondo Java scrivo sempre:

 Pixel* p = new Pixel(); p->x = 2; p->y = 5; 

Fondamentalmente fanno la stessa cosa, giusto? Uno è in pila mentre l’altro è nell’heap, quindi dovrò cancellarlo in seguito. C’è qualche differenza fondamentale tra i due? Perché dovrei preferire uno rispetto all’altro?