Per evitare qualcosa del genere:
codice:
class Test {
   public:
      Test() : ptr(new char[16]) {}
      ~Test() { delete [] ptr; }
   private:
      char* ptr;

};

int main (void) {

   /* riduce lo scope */ {
      Test t;
      Test t1 = t;
      Test t2;
      t2 = t;
   }
   // errore di accesso.
}
Il puntatore è cancellato tre volte di cui solo la prima è valida.
Ci sono altri motivi per inibire la copia e/o l'assegnazione, ma questo è il principale.