it-swarm.it

Quali sono le differenze fondamentali tra C e C ++?

Molti tendono a scrivere "C/C++", come se fossero la stessa cosa. Sebbene condividano molte somiglianze, non sono chiaramente le stesse.

Ma quali sono le differenze fondamentali tra C e C++? C++ è una versione avanzata di C o ci sono funzionalità in C che non esistono in C++?

41
gablin

I seguenti punti si riferiscono al C++:

  1. (definito dall'utente) sistema di tipo statico: consente controlli statici sui dati e sul loro utilizzo - indica molti errori facilmente eseguibili in C.
  2. multi- "paradigm": consente di lavorare come in C, con paradigmi orientati agli oggetti, con paradigmi generici ecc.
  3. Costruttore/Distruttore: l'unico modo per dire una volta cosa fare quando si crea o si distrugge qualcosa ed essere sicuri che l'utente non dovrà trovare la funzione giusta e usarla come in C.
  4. RAII (nome errato): non è necessario gestire sempre la memoria. Mantieni gli scopi e usa i puntatori intelligenti che descrivono la durata degli oggetti. È ancora possibile utilizzare i puntatori non elaborati.
  5. Modelli: meglio della macro, un vero linguaggio per manipolare e generare tipi prima della compilazione finale. Manca solo un sistema di tipi (vedi Concetti nei futuri standard C++).
  6. Sovraccarichi dell'operatore: consente di descrivere le operazioni in modo sintattico semplice e persino di definire linguaggi specifici del dominio incorporati all'interno del codice C++.
  7. Nomi con ambito: spazi dei nomi, classi/struttura, funzioni, ecc. Hanno regole semplici per assicurarsi che i nomi non si scontrino.
  8. Sistema di eccezione: un modo per propagare errori che spesso è meglio del codice di ritorno. In effetti, il codice di ritorno è utile per errori logici specifici del dominio, poiché l'applicazione deve gestirlo. Le eccezioni vengono utilizzate per errori "difficili", cose che rendono il seguente codice semplicemente errato. Permette di rilevare errori più alti nello stack di chiamate, se possibile, reagire a tale eccezione (registrando o correggendo lo stato) e con RAII, se ben utilizzato, non rende l'intero programma sbagliato - se fatto bene, di nuovo.
  9. The Standard Library: C ha il suo, ma è tutto "dinamico". La libreria standard C++ è quasi (non IO) fatta di modelli (contenitori e algoritmi) che consente di generare codice solo per quello che usi. Meglio: poiché il compilatore deve generare codice, lo farà conoscere molto il contesto e applicare in modo accattivante molte ottimizzazioni senza dover richiedere al programmatore di offuscare il suo codice, grazie a modelli e altre cose.
  10. const-correctness: Il modo migliore per assicurarti di non cambiare le variabili che non dovresti. Permette di specificare l'accesso in sola lettura alle variabili. E viene controllato solo al momento della compilazione, quindi non ci sono costi di runtime.
43
Klaim

Il C++ è stato inventato per gestire complessità che C non poteva gestire. Ad esempio, un problema comune con C era che si potevano "esaurire i nomi per le variabili" (da non prendere alla lettera ovviamente) perché non c'erano incapsulamenti, spazi dei nomi ecc.

Inoltre, C non ha eccezioni, quindi la gestione degli errori è molto soggetta a errori, poiché dipende dall'utente della biblioteca controllare sempre i valori di ritorno delle funzioni, mentre con le eccezioni, lo sviluppatore della libreria lancia semplicemente un'eccezione che garantisce che il flusso del programma verrà interrotto.

Il C++ aiuta avendo gli oggetti init del costruttore che vengono chiamati automaticamente dal compilatore. A differenza delle strutture C che devono essere inizializzate dal programmatore (quindi un'altra area soggetta a errori).

Infine, ci sono molti altri vantaggi propagandati da OOP, come il riutilizzo degli oggetti così come i concetti di programmazione generica, come modelli e generici che consentono di riutilizzare il codice sorgente, ecc.

31
Jas

In generale, tutto ciò che esiste in C è supportato in C++. Ovviamente il contrario è assolutamente falso.

In parole semplici, C++ è orientato agli oggetti (quindi, per esempio, hai delle classi), C no.

C++ ha un tipo booleano C89 no.

Sono lingue diverse. Condividono solo la maggior parte della sintassi.

15

C99 ha alcune funzionalità che non esistono (almeno nella stessa forma) in C++ (ad es. Membri di array flessibili, array a lunghezza variabile, ecc.)

C99 ha anche aggiunto molto alla libreria che non è presente nello standard C++ 98/03; la maggior parte di questo è stata aggiunta a C++ 11.

In termini di orientamento di base, C sostanzialmente supporta la programmazione procedurale strutturata. C++ supporta questo oltre alla programmazione orientata agli oggetti, alla programmazione generica e alla metaprogrammazione (esecuzione di calcoli arbitrari in fase di compilazione). Con C++ 11, aggiunge alcuni bit e pezzi che potrebbero almeno essere confusi con il supporto della programmazione funzionale (ad esempio, espressioni lambda). C++ 14 ne ha aggiunti alcuni altri, ma la maggior parte di essi è davvero più comoda rispetto a qualsiasi tipo di grande cambiamento nell'orientamento.

8
Jerry Coffin

Personalmente, penso che i modelli siano la caratteristica più significativa che C++ aggiunge a C.

1
zvrba