Dato che C ++ '11 è stato approvato, questo cambia il modo in cui un principiante C ++ impara la lingua? [chiuso]


21

Volevo imparare C ++ per un po 'e ho preso AP Computer Programming in High School (quando era C ++ e non Java). Mi piace il C e non ho trovato il tempo per imparare il C ++ o mi limiterò a tornare su C # dove sono molto più produttivo.

La mia domanda è questa: dato che il C ++ '11 è stato approvato (anche se so che non è completamente implementato), questo cambia il modo in cui dovrei avvicinarmi all'apprendimento del C ++? Possiedo il C ++: The Complete Reference di Herb Schildt, che risale al 1998. Lo standard recentemente approvato rende l'apprendimento da tali libri meno importante di alcuni dei tutorial / libri più recenti che includono elementi dello standard? C'è qualche vantaggio nell'apprendere dai libri più vecchi?


9
Oof. Schildt. Non posso parlare della qualità dei suoi materiali C ++, ma i suoi materiali C erano sotto-standard per molto tempo (anche l'ultima edizione di C: TCR presenta ancora alcuni errori non banali). Consiglio di cercare un'opera più attuale di un altro autore.
John Bode,

C ++ 11 non ha modificato le basi del C ++ che deve essere appreso per fare tutto ciò che è stato introdotto nell'ultima revisione e non esiste in una versione precedente di C ++.
Ramhound,

11
Non fidarti mai di un libro di Herb Schildt. Davvero, mentre la maggior parte dei libri in C ++ sono libri cattivi (e non mi riferisco a problemi stilistici qui, ma errori di fatto palesi e promozione di stili di programmazione noti per portare a codici errati), i libri di Schildt sono stati così straordinariamente cattivi, il suo nome divenne in qualche modo un meme.
sabato

4
@Ramhound: non sono d'accordo. Se ciò fosse vero, impareremmo comunque tutti prima la gestione manuale delle risorse e solo successivamente modi più sicuri per fare risorse dinamiche. Per fortuna, questo (lentamente) sta cambiando. Nuove possibilità, anche se sono "solo" nella biblioteca, richiedono nuovi modi di dire. Se inizi con una lingua, perché imparare prima i modi di dire più vecchi, solo per disimpararli in seguito?
sabato

Risposte:


16

Assolutamente. In questi giorni tre cose che di solito sono nella lezione 2 dovrebbero spostarsi molto, molto più tardi:

  • stringhe come matrici di char *, i metodi strlen, strxxx e così via
  • array in generale e aritmetica puntatore
  • elimina ciò che è nuovo, elimina [] ciò che è nuovo [] e persino i distruttori

Queste cose che di solito sono nella lezione 99 dovrebbero muoversi molto, molto prima

  • modelli come cose da usare (scrivere, non tanto)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, iteratori, altre raccolte

Ogni puntatore non elaborato dovrebbe essere immediatamente assegnato a un wrapper di puntatore intelligente (inizierei con condiviso e considererei unico in seguito poiché richiede di spiegare i riferimenti std :: move e rvalue). In questo modo l'apprendimento del C ++ sembrerà molto simile all'apprendimento di Java o C #, dove impari la libreria contemporaneamente alla lingua. Porterà via anche molto lavoro di memoria e lascerà le persone meno preoccupate per i gotchas.

Vorrei anche inserire lambda nell'immagine la prima volta che volevamo scorrere una raccolta e fare qualcosa per ogni elemento.

Disclaimer: sto scrivendo un corso C ++ per Pluralsight in questo momento e sto usando questo approccio. L'ultimo modulo è "capire il codice di altre persone" ed è qui che inserirò cose confuse come stringhe di caratteri *, gestione manuale della memoria, aritmetica dei puntatori e così via.

Aggiornamento: alcune persone hanno chiesto perché l'esistenza di C ++ 0x ispira insegnare cose che avrebbero potuto essere insegnate con C ++ 03. Penso che sia un numero di cose:

  • i puntatori veramente intelligenti, che sono facili da raccogliere, eliminano la necessità di cose come "una serie di puntatori dei dipendenti" che ci stavano facendo ricadere sempre su nuovo / elimina, aritmetica dei puntatori ecc.
  • auto toglie il dolore delle dichiarazioni dell'iteratore
  • i lambda fanno predicare qualcosa che farebbe una persona normale
  • anche qualcosa di così banale come analizzare >>correttamente elimina il gotcha che sarebbe lì quando si dichiarano alcuni modelli di modelli
  • e così via

Per come la vedo io, ci sono cose che avremmo potuto cambiare nel modo in cui insegnavamo C ++ qualche tempo fa, ma alcuni di noi si sono trattenuti perché avevamo ancora bisogno della vecchia scuola per un fallback o perché insegnarlo comportava solo di conoscenza arcana.


3
Perché ritieni che la gestione manuale della memoria debba essere insegnata in seguito? Penso che sia importante saperlo e che apprezzi di più l'apprendimento dei puntatori intelligenti. Ho dovuto imparare la gestione della memoria (e gli array di caratteri) in C e mi ha fatto apprezzare RAII e std :: string molto più di quanto penserei se non avessi dovuto farlo.
Jetti,

1
I tuoi esempi si applicano principalmente a C ++ 98 vs. C ++ pre-standard, non C ++ 03 vs. C ++ 11. Suppongo che dato lambda, std::for_each()sarà molto più popolare di prima, autosarà molto importante e la nuova sintassi della dichiarazione di funzione (insieme a decltype) verrà usata molto nel codice del modello. Queste sono cose che nessun libro C ++ attuale insegna. Ma sì, in generale sono d'accordo con te ( +1). Quando ho iniziato a tenere corsi in C ++, ho iniziato con Accelerated C ++ , e anche se il mio corso ha iniziato a deviare sempre di più da esso, rimane comunque fedele al principio sottostante.
sabato

3
@Jetti: raramente faccio la gestione manuale delle risorse, e se lo faccio, è per l'implementazione delle classi RAII. Uso tuttavia molte di queste classi. In base a ciò, l' uso di materiale RAII sembra più importante della gestione delle risorse grezze e dovrebbe quindi essere insegnato prima, con maggiore enfasi.
sabato

1
@sbi: Devo essere d'accordo con te lì- la maggior parte di questi esempi sembrano Modern C ++ 101 del 2006, non nulla di nuovo su C ++ 11.
DeadMG

2
@Jetti: il passo più importante verso la padronanza del C ++ è imparare tutti i modi in cui è possibile evitare la gestione manuale della memoria. È assolutamente qualcosa che dovrebbe essere insegnato "più tardi", una volta che hai imparato fino a che punto puoi passare attraverso la gestione della memoria "automatica".
jalf

9

Praticamente sì. Il semplice fatto è che in C ++ 98 e 03 molte buone pratiche erano fondamentalmente inutilizzabili a causa della scarsa qualità del supporto linguistico per la programmazione funzionale. Ora che i lambda esistono e funzionano, le persone tendono ad accettare le interfacce funzionali molto meglio di prima e la programmazione generica è persino più forte di prima.

Nel 1998, le persone stavano appena iniziando a scoprire come scrivere codice veloce, sicuro e di alta qualità usando C ++, e molto codice era "C was Classes". In C ++ 11, è molto diverso - idiomi come copia e scambia e la Regola dei tre (ora Cinque) sono ben noti e definiti, e molti più tipi di gestione delle risorse sono diventati Standard, come shared_ptre unique_ptrdove gli Standard precedenti li hanno semplicemente lasciati come buchi spalancati.

È possibile visualizzare questa domanda per un eccellente elenco di materiale di riferimento su C ++.


1
In realtà avrei messo l'inizio della fine della "C con lezioni" qualche anno prima del 1998, ma in generale hai certamente ragione, e non contrattare per oltre mezzo decennio. +1da me.
sabato

4

Non conosco il libro specifico di cui parli. Ma in generale si può dire che tutte le basi della sintassi C ++, i tipi di dati e OOP sono ancora validi. Lo stesso dovrebbe valere per le librerie STL menzionate nella maggior parte dei libri per principianti.

Sebbene un libro vecchio del 1998 possa aver perso alcuni aggiornamenti e sviluppi nello stile di programmazione C ++, che si è accumulato nella comunità nel corso degli anni. Vorrei cercare risorse leggermente più aggiornate. Ci sono più che sufficienti tutorial e documenti online gratuiti che dovrebbero fornirti un buon inizio. Alcuni di essi potrebbero persino menzionare C ++ 0x.

C ++ 0x cambierà sicuramente molto su come i programmatori vedranno e useranno la lingua in futuro. Ma ciò influenzerebbe i progetti più complessi in cui le nuove funzionalità iniziano a dare un senso. Per un principiante questo non dovrebbe importare e puoi concentrarti su come familiarizzare con i concetti esistenti, è già abbastanza per imparare. La maggior parte dei libri per principianti non approfondisce i modelli, ad esempio, quindi i nuovi modelli variadici non sono ciò che devi sapere ora.

Forse dai un'occhiata a un elenco di modifiche . Almeno alcuni concetti come range based for loop appariranno molto probabilmente in nuovi tutorial anche per i principianti. Quindi vale la pena dare un'occhiata.


Grazie! Sei a conoscenza di risorse online o libri decenti?
Jetti

2
No, il sito cplusplus è spesso menzionato come una risorsa che non dovrebbe mai, mai essere indirizzata a chiunque desideri scrivere un buon codice.
DeadMG

@DeadMG Hai un sito Web alternativo?
TheLQ

@TheLQ: otterresti ulteriori risultati con il riferimento MSDN o cprogramming.com.
DeadMG

@Jetti: Non sono a conoscenza di alcun materiale per l'utilizzo del C ++ 11 per insegnare il C ++. Tutto ciò che ho visto insegna C ++ 11 oltre a C ++ 03. Per l'apprendimento di quest'ultimo, consultare stackoverflow.com/questions/388242/… .
sabato

3

Naturalmente, per quanto riguarda tutto ciò che riguarda la tecnologia, essere aggiornati con il materiale più recente è sempre una mossa intelligente, tuttavia, le modifiche introdotte in C ++ 11 sono progettate per non scuotere la barca. Se non conosci C ++ (o la programmazione in generale), non mi preoccuperei di questo.

Inoltre, se sei un programmatore professionista, puoi scommettere che lavorerai sul codice di qualcun altro in futuro, quindi è sempre utile capire come funzionano le cose, anche se in pratica è una tecnica deprezzata.


Grazie per la tua risposta, ho pensato che mi avrebbe aiutato almeno a guardare il vecchio codice quando usavo una vecchia risorsa.
Jetti

Come poteva lambda, autoe l'esecuzione della funzione asincrona fare altro che "scuotere la barca"?
sabato

1
Direi che c'è una distinzione tra l'introduzione di nuovi strumenti e un ampio cambiamento nella filosofia del design (come stiamo vedendo con PHP, per esempio)
Leo

1
@leo: non sono d'accordo. L'introduzione dell'STL, i puntatori intelligenti e le ricche funzionalità per i template hanno cambiato totalmente la filosofia di progettazione tradizionale del C ++. Quasi ogni libreria boost è totalmente diversa dalla tua libreria C ++ media degli anni '90.
sbi,
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.