Non esiste un programma elegante in C, a meno che non contenga esempi eccessivamente banali. I vantaggi di OO diventano intrinsecamente evidenti non appena si tenta di fare anche qualcosa di semplice, come le stringhe. Se non riesci a capire perché std::string
sia molto meglio delle stringhe C in ogni modo possibile, devi dare un'occhiata più da vicino. Ti darò un vantaggio dimostrando alcuni dei grandi vantaggi:
La classe di stringhe Standard gestisce tutta la sua memoria - in particolare, sei garantito per non perdere mai, mai, una std::string
. È molto più avanti di una stringa C.
La classe di stringhe Standard offre dimensioni O (1). Le stringhe C offrono solo la dimensione O (n).
La classe di stringhe Standard non richiede la terminazione NULL. Questo risolve molti errori "off-by-one" che esistono nel codice stringa C.
La classe di stringhe standard non può avere la memoria liberata da un altro utente. Non può avere la memoria essere riallocata da un altro utente. La proprietà è esplicita e imposta dal compilatore. Se passi una char*
a una funzione, potrebbero tentare di liberarla quando lo fai già, o cose del genere.
La classe di stringhe Standard è più intelligente di te. Nello specifico, può fare cose come l'ottimizzazione delle stringhe di piccole dimensioni senza dover modificare il codice utente. Se si desidera implementare SSO, è necessario refactoring ogni singolo bit di codice che utilizza le stringhe. Quando std::string
implementa SSO, non te ne accorgi nemmeno.
La classe di stringhe standard è generica. La funzione per l'ordinamento di un vettore di numeri interi è la stessa di quella per l'ordinamento di un vettore di stringhe, ed è anche più veloce del qsort
di C.
La classe di stringhe Standard cresce quando necessario. Non più codici MAGIC_BUFFER_SIZE
che superano il limite e sono vulnerabili e puoi garantire che il tuo implementatore di librerie abbia impiegato molto tempo, molto più tempo di quanto tu possa mai giustificare, spendere e definire il modo ottimale in cui crescere.
Quando si compila in modalità Debug, la classe di stringhe Standard verificherà gli iteratori e gli indici e, quando richiesto, indicizzerà anche il codice normale. Un char[]
farà questo per te? Ne dubito.
Quindi std::string
è più veloce, più sicuro e più manutenibile rispetto alle stringhe C. Altre classi offrono ragioni molto simili per essere di gran lunga superiori in ogni modo possibile. Cosa vuoi di più dall'orientamento all'oggetto diverso dalla velocità superiore, dalla correttezza e dalla facilità di manutenzione?
Quindi, quasi per definizione , qualsiasi programma C ++ che sia equivalente al tuo programma C ma che usi OO per gestire le stringhe è intrinsecamente e di gran lunga superiore al tuo programma C.
Il problema che esponi è più facilmente reperibile qui:
I believe to be a much more elegant program.
Credi? Eccezionale. Perché in realtà non torni indietro e controlla ? Perché penso che lo scoprirai, i programmi sono buggati e lenti, e sarebbero notevolmente migliorati da un'applicazione giudiziosa di orientamento agli oggetti solidi. I tuoi sentimenti soggettivi sorgono per ragioni che non hanno nulla a che fare con l'effettiva qualità del programma.
Devi riconoscere che le qualità oggettive di velocità, manutenzione e correttezza di un programma non hanno assolutamente nulla a che fare con la tua opinione soggettiva sul fatto che sia elegante o meno.
E sai cosa? OO, non tutti i problemi vengono affrontati al meglio. C'è un motivo per cui linguaggi come C # hanno lambda e generici, ed è perché l'eredità non è un coltellino svizzero. È solo uno strumento, e ce ne sono altri che servono meglio a determinati scopi. È, tuttavia, uno strumento straordinariamente efficace per molte situazioni, meglio utilizzato per strutturare programmi e moduli.