C ++ per sviluppatori C #


24

Conosco C # abbastanza bene (autodidatta, purtroppo) e devo fare un po 'di programmazione C ++ per un'applicazione Windows. Sono stato in grado di trovare un sacco di informazioni per gli sviluppatori di C ++ che imparano il C # ma non sono stato in grado di trovare molto sull'apprendimento del C ++ quando già conosci C #. Qualcuno ha trovato una buona carrellata delle basi?

MSDN ha un confronto ma non è molto approfondito.

Posso mettere insieme diverse fonti ma ho pensato che qualcosa fosse là fuori - non riesco proprio a trovarlo. Grazie per l'aiuto.


27
Perché "tristemente"? Non metterti giù così. Non conosco uno sviluppatore C # che non sia autodidatta. Molti dei quali sono sviluppatori straordinari .
Steven Evers,

6
@SnOrfus - principalmente perché il mondo accademico lo evita per irrazionali ragioni pseudo-politiche.
Rei Miyasaka,

5
Il mio primo consiglio è non cercare di imparare il C ++ nel contesto di C #. Perché C # non è C ++ e C ++ non è C #. Potrebbe essere un'affermazione stupida da fare ma C # rende difficile sbagliare i puntatori, ed è molto facile sbagliarli in C ++, anche con gli strumenti che lo rendono realisticamente facile. Vorrei aggiungere che ci sono molte cose che le due lingue condividono in comune. Fondamentalmente è come dire che una mela e un'arancia sono entrambe coltivate su un albero e hanno semi e quindi sono frutti.
Ramhound,

2
@ReiMiyasaka, non diversamente da come gli sviluppatori C # guardano VB .NET.
Kyralessa,

1
@Kyralessa Che è anche un po 'sfortunato. Penso che non sia tanto un problema politico quanto una condiscendenza nei confronti del gruppo demografico VB.NET, perché la maggior parte dei primi utenti di C # ha un background C / C ++. La mia scuola ha usato VB.NET per i corsi per principianti. Sembrano pensare che VB.NET sia un giocattolo, e quindi non dovrebbe corrompere le menti degli studenti come C #.
Rei Miyasaka,

Risposte:


10

Questo thread su C ++ per sviluppatori Java è molto simile e dovrebbe essere utile, in particolare il post di Mark Byer:

Leggi questi libri:

Probabilmente la cosa più importante da tenere a mente è capire la differenza nelle tecniche di gestione della memoria tra C # / Java e C ++ .

Uno dei miei prof proveniva da un background Java e ha insegnato un corso introduttivo in C ++ pensando che sarebbe stato un dolce. Nulla di ciò che aveva spiegato aveva alcun senso per nessuno. Aveva avuto perdite di memoria ovunque. L'aritmetica del suo puntatore era terribile. Non è mai arrivato alla parte OOP del programma (grazie a dio). Praticamente nulla da lui dimostrato sarebbe stato compilato. Non capiva che char[]serviva una sentinella \0. Non finire come lui.


4
Peccato che nessuno in C ++ usi char[]allora , no?
DeadMG

5
@DeadMG Non riesco proprio a capire il tuo punto. Solo perché char[]raramente viene usato in C ++ non significa che non sia stato insegnato o che non dovrebbe essere insegnato. char[]è ancora importante essere consapevoli perché C ++ è un superset di C, ed è indispensabile che sia compreso correttamente se deve essere appreso affatto.
Rei Miyasaka,

7
Sì, molto, molto tempo dopo aver imparato su ogni altro aspetto della lingua. Preferirei insegnare ai nuovi studenti specializzazioni di template parziali e SFINAE. In C ++, usi std::string, e se devi interagire con un'API C, allora è quello che c_str()serve. Non è necessario che il programmatore abbia a che fare con la char[]risoluzione NULL o nulla di tutto ciò. La gestione delle stringhe in stile C è completamente e totalmente deprecata per ogni possibile utilizzo tranne l'interoperabilità con il vecchio codice C, che è perfettamente ben gestito da c_str().
DeadMG

4
Non esiste un insegnamento char[]corretto, perché tutti gli usi di char[]sono sbagliati. Il tuo professore probabilmente sarebbe andato benissimo se fosse rimasto
fedele

4
Si dovrà vedere il codice C usato in C ++ se si scrive C o no te stesso, e di conseguenza, se si sta imparando C ++, è necessario imparare C. Come ho detto, io non approvo, ma il fatto della questione è che le scuole generalmente insegnano C e poi virare su C ++ più tardi, perché gli studenti hanno bisogno di essere insegnato cose come il design del sistema operativo - che, escludendo BeOS e alcuni sistemi operativi di ricerca, assolutamente richiedono C. per questo, si fa bisogno di capire stringhe C. Ancora una volta, per la terza volta, se potessi fare a modo mio, non insegnerei affatto il C ++ agli studenti del primo anno, e per l'ultima volta, questo è completamente al di là del punto.
Rei Miyasaka,

14

Sfortunatamente, non c'è molto nel C ++ che è di base, quindi non avrei le tue speranze. Inoltre, c'è poco che saprai su C # che è anche trasferibile in remoto in C ++, quindi non mi aspetto che esista alcun materiale specifico che copra quell'angolo. Dovrai imparare da zero.


3
Ciò spiegherebbe perché non c'è molto là fuori. Dopo aver letto su C ++ sembrerebbe che tu abbia ragione: è un mondo completamente diverso. Grazie per l'aiuto.
Mark Williams

1
+1, c'è poco che saprai su C # che è anche trasferibile in remoto in C ++ . L'ho imparato nel modo più duro.
ApprenticeHacker

Per prima cosa, direi che c'è molto C ++ di base. Distinguere puntatori / riferimenti e modelli C ++ può far girare la testa all'inizio, ma quando si tratta di esso ci sono ancora classi coute modi semplici per raggiungere obiettivi semplici
Kieren Johnstone

1
@KierenJohnstone: Probabilmente intendi "modi lenti e non sicuri per fare cose" come "decadimento da array a puntatore" e cose del genere.
DeadMG

12
Bella risposta del tutto inutile.
dbracey,

9

Non esiste una soluzione semplice per questo, C ++ non è particolarmente difficile, ma non è facile per i principianti.

Consiglierei di leggere le basi della programmazione in C (per ottenere una base delle cose di basso livello che troverai), quindi imparare lo STL, seguito da articoli di artisti del calibro di Scott Meyers. Ecco uno per iniziare, in quanto mostra come dovresti scrivere il C ++ moderno, rispetto al C con classi.


2
+1: Aggiungerei i libri di Meyer (serie C ++ / STL efficace). Li ho tutti e sono fantastici.
Steven Evers,

12
-1 per reading up on C programming. Penso che questo faccia più male che bene e sostiene l'idea che C e C ++ sono linguaggi che devono essere studiati insieme.
sebastiangeiger,

2
@sebastiangeiger: ti manca il punto che quando uno deve lavorare con le applicazioni C ++ esistenti nel mondo reale, dovrai spesso fare i conti con costrutti di tipo C. Quindi +1, almeno per eliminare il tuo voto negativo.
Doc Brown

5
@DocBrown Forse, ma sto facendo parte di uno di quei progetti legacy C ++ in questo momento e posso dire che i miei predecessori erano in gran parte solo programmatori C che salvarono i loro file sorgente come * .cpp. Ho scoperto che sto usando molto meno deletee array C e altre cose che sono scoraggiate in C ++ rispetto a loro, che attribuisco a NON studiare esplicitamente C. C è relativamente semplice, puoi capire abbastanza rapidamente cosa fa il codice.
sebastiangeiger,

3
@gbjaanb: Non c'è niente, a proposito, dell'STL che richiede conoscenza malloce free. Un grande sviluppatore di C ++ vorrà eventualmente conoscerli. Iniziare da loro è completamente diverso.
DeadMG

7

Non sono sicuro che stia ancora cercando materiali, ho trovato questo articolo qualche mese fa. Non è un libro (solo 53 pagine). L'introduzione dice tutto:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

E c'è anche un post di aggiornamento:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Buon apprendimento :)


Fai molta attenzione quando usi questo documento, mostra C ++ in un modo molto centrato su Microsoft (lo dice anche). Non distingue tra le funzionalità C ++ 03 e C ++ 11 e talvolta mostra persino estensioni non standard come soluzione preferita. Se segui quella guida, finirai con un codice altamente insostenibile.
Fabio Fracassi,

4
  • Cerca la gestione della memoria. Ottieni una chiara idea di come funzionano i puntatori e i riferimenti in C ++ in contrasto con C #. Inoltre, RAII, finalmente la gestione manuale della memoria e gli smart pointer.
  • Modelli e generici sembrano simili ma sono bestie diverse. Conosci gli interni di come funzionano i template.
  • Ci sono alcune differenze sintattiche minuscole ma accattivanti. Imparali.
  • Ti sei abituato a STL invece di .net BCL. Potresti perdere alcuni bit positivi se hai la dipendenza LINQ.
  • Esistono alcune differenze di progettazione fondamentali tra C ++ e C #. Quindi, non puoi semplicemente portare un'idea. Qualunque cosa tu costruisca con C ++, devi progettare da zero.
  • In bocca al lupo

1

Penso sia positivo che non trovi troppi tutorial da C # a C ++. Probabilmente potrebbero confondere il tuo cervello. È un po 'come provare a imparare prima a guidare una motocicletta e poi a passare a una bicicletta (non un'anologia del tutto appropriata ma ti viene l'idea). È meglio per te prendere un nuovo libro su C ++. Poiché hai già familiarità con i concetti di OOP, puoi saltare le lunghe introduzioni ai concetti di OOP (sono pensate per le persone che migrano da C a C ++). Oppure vai direttamente a un libro di riferimento destinato ai livelli da principiante a intermedio o intermedio.


1

Consiglierei di andare a Rosetta Code e di confrontare i due. Mentre sei lì, tieni a portata di mano un link di idiomi C ++ e cerca di individuarli. Quindi passare un po 'di tempo sul regno puntatore / riferimento / memoria / distruttore. Dopo aver appreso del preprocessore - può davvero essere tuo amico quando si tratta di nascondere i brutti, mi manca un po '. Infine, la STL.


1

Quindi, circa un anno fa ero nella tua stessa barca: autodidatta c # dev che sentiva il bisogno di imparare il C ++. Concesso, mi sono fermato e iniziato più volte. Al mio terzo tentativo, finalmente ci sono riuscito.

Ciò che è assolutamente necessario capire è che, in termini di metodologie C ++ e C #, probabilmente passerai molto tempo a capire cosa significano realmente i metodi di manipolazione dei dati attraverso puntatori e riferimenti , nonché quando e come usarli in base alle circostanze.

La cosa bella di C ++ è che l'allocazione di stack di oggetti è abbastanza semplice per la maggior parte, e dovresti allocare oggetti in questo modo se il tuo programma soddisferà i requisiti specificati con questo metodo. Altrimenti, fai affidamento sui puntatori per velocità, efficienza e pulizia rapida. Vi consiglio di leggere questo: http://www.parashift.com/c++-faq-lite/ in quanto vi fornirà MOLTE conoscenze tecniche su come funziona il C ++ sotto il cofano.

Lasciate che vi faccia un esempio:

In C ++ esiste questa implementazione del costruttore nota come "elenco di inizializzazione", che differisce dall'inizializzazione dei membri della classe nel corpo di un costruttore. Perché? Perché a meno che il tipo da inizializzare non sia primitivo, il compilatore creerà effettivamente copie multiple e non necessarie dell'oggetto creato quando allocato nel corpo del ctor. Ciò può potenzialmente ridurre le prestazioni, a seconda del compilatore e dei requisiti ridimensionati dell'app.

Sai cos'è un delegato? Bene, in C ++ è noto come puntatore a funzione . All'inizio questo linguaggio è piuttosto difficile da padroneggiare, ma se vuoi essere fantastico ... è sicuramente necessario.

C # è facile ... molto semplice.


I delegati C # e i puntatori a funzioni c sono abbastanza diversi. Un delegato è più vicino a un funzione in C ++ che a un puntatore a funzione.
CodesInChaos,

-2

Credimi, scegli un buon libro su C ++ (ce ne sono molti di più, basta fare una ricerca) e iniziare a imparare ...


1
A proposito, apprendere qualche C prima (puntatori, array, struct) andrà bene
Muhammad Hewedy

7
Imparare il C prima del C ++ ti riporterà all'età della pietra. Al giorno d'oggi, usiamo molto raramente array e puntatori in C ++. La lingua si è evoluta lontano da loro molto tempo fa.
Fredoverflow

7
@Muhammad: tutti gli altri preferiscono velocità, sicurezza, facilità di manutenzione.
DeadMG

3
@DPD: Beh, molti programmatori professionisti C ++, tra cui Bjarne Stroustrup (l'inventore del linguaggio), non sono d'accordo con te. Il suo ultimo libro insegna l'uso di oggetti e modelli sin dall'inizio, mentre le matrici e i puntatori non sono affatto discussi prima del capitolo 17 (pagina 500 e qualcosa del genere).
Fredoverflow

2
@DeadMG. Forse, ma non puoi ripristinare l'evoluzione C-> C ++. Se odi la parte C di C ++, scegli Java o C #. Personalmente, ho scoperto che concentrarmi su puntatori e matrici in C prima di andare in C ++ mi ha aiutato molto nella mia carriera. Certo, puoi codificare un'intera applicazione senza di loro, ma se vuoi i benefici del polimorfismo devi conoscere i puntatori. Quanti dei modelli GoF importanti possono essere implementati senza puntatori? Non era lo stesso per i miei amici che evitavano le parti "difficili" quando studiavano C. La maggior parte di loro trovava difficile comprendere il polimorfismo.
DPD,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.