C ++ È stato scritto in maniera succinta per aiutare gli sviluppatori di C # a imparare la programmazione in C ++. Lo scopo di questo libro è quello di sfruttare le tue conoscenze C # esistenti al fine di espandere le tue competenze. Se hai bisogno di usare C ++ in un progetto imminente, o semplicemente vuoi imparare un nuovo linguaggio (o riacquistarti con esso), questo libro ti aiuterà a imparare tutti i pezzi fondamentali del C ++ in modo da poter capire progetti e campioni scritti in C ++ e inizia a scrivere i tuoi programmi C ++.
Come per qualsiasi argomento di grandi dimensioni, semplicemente non c'era spazio per coprire tutto (un esempio sono le nuove funzionalità atomiche aggiunte in C ++ 11), e altri potrebbero aver deciso di ordinare gli argomenti in modo diverso. Sto pensando in particolare ai suggerimenti, un argomento che approfondisco ulteriormente nel libro. Sono importanti, quindi alcuni potrebbero aver scelto di coprirli prima, ma sento che non è necessario comprendere i suggerimenti per comprendere il materiale che precede la loro copertura; comprendere gli argomenti precedenti ti renderà molto più facile comprenderli.
Ho fatto del mio meglio per essere il più preciso possibile senza sembrare una specifica del linguaggio o un file di documentazione. Spero di esserci riuscito. Ho consultato frequentemente le specifiche del linguaggio C ++ 11 mentre scrivevo questo, e ho anche letto tutto dai post StackOverflow, ai documenti MSDN, ai documenti GCC e oltre. Ci sono aree in cui ho intenzionalmente semplificato le cose. Man mano che continui ad espandere la tua conoscenza del C ++, troverai senza dubbio problemi in cui devi avere una comprensione più completa per raggiungere il tuo obiettivo o eliminare un bug. Se la lettura di questo libro impartisce una conoscenza sufficiente - e una sensazione abbastanza buona per la lingua che sei in grado di riconoscere, diagnosticare e risolvere questi problemi - allora sarò contento di aver raggiunto i miei obiettivi. Benvenuto in C++!
Essendo un avvocato in pensione, mi sento in dovere di includere questa breve sezione, che probabilmente non ti interessa a meno che tu non sia un avvocato per una di queste società o organizzazioni. Il resto di questa prefazione è una lettura molto più piacevole per i non avvocati, quindi per favore non lasciatevi scoraggiare. Microsoft®, Visual Studio®, Visual C ++ ®, Visual C # ®, Windows®, Windows NT®, Win32®, MSDN®, Silverlight®, DirectX® e IntelliSense® sono marchi registrati di Microsoft Corporation. GNU® è un marchio registrato della Free Software Foundation. ISO® è un marchio di servizio registrato dell'Organizzazione internazionale per la standardizzazione. IEC® è un marchio di servizio registrato di International Engineering Consortium, Inc. Unicode® è un marchio di servizio registrato di Unicode, Inc. (a.k.a. Unicode Consortium). Intel® è un marchio registrato di Intel Corporation. Altri marchi e marchi di servizio sono di proprietà dei rispettivi proprietari.
In C #, il punto di ingresso per un programma è un metodo statico chiamato Principale
. Spesso non lo vedrai in realtà poiché vari framework forniscono il loro (ad es. Silverlight), ma è lì, da qualche parte, poiché senza di esso il sistema operativo non saprebbe da dove iniziare ad eseguire il tuo programma.
Il punto di ingresso di un programma C ++ è il principale
funzione. Una versione semplice ha questo aspetto:
int main (int argc, char * argv []) // Il tuo programma inizia qui. // Il ritorno 0 indica il successo. ritorno 0;
I parametri sono il conteggio degli argomenti seguito da una matrice degli argomenti della riga di comando (come stringhe). Nella programmazione di Windows, lo vedrai spesso come il punto di ingresso:
int wmain (int argc, wchar_t * argv []) // Il tuo programma inizia qui. // Il ritorno 0 indica il successo. ritorno 0;
Questo wmain
il punto di ingresso è specifico di Microsoft. Viene utilizzato come punto di ingresso per i programmi Unicode di Windows (al contrario dei vecchi programmi ASCII / code page). I sistemi operativi Microsoft che supportano Unicode (tutto da Windows 2000 e Windows NT 4 in poi, e persino i sistemi basati su Win 9X quando si installa un componente aggiuntivo speciale) utilizzano la codifica UTF-16. Pertanto, si dovrebbe sempre usare Unicode durante la scrittura dei programmi, a meno che non sia assolutamente necessario supportare sistemi precedenti che non dispongono del supporto Unicode.
Spesso lo vedrai anche come punto di ingresso per i programmi Windows:
#includereint _tmain (int argc, _TCHAR * argv []) // Il tuo programma inizia qui. // Il ritorno 0 indica il successo. ritorno 0;
Windows SDK fornisce il tchar.h file di intestazione, che puoi (e dovresti) usare quando hai bisogno di costruire un progetto che verrà utilizzato su entrambe le versioni Unicode e non Unicode di Windows. Non lo uso nei campioni perché, per quanto possibile, volevo rendere i campioni portatili e conformi agli standard.
Invece, ho scritto un piccolo file di intestazione, pchar.h, che semplifica il problema della portabilità del punto di ingresso. Questo non risolve la maggior parte dei problemi di portabilità che si verificano quando si ha a che fare con le stringhe; sfortunatamente, la portabilità delle stringhe è un'area che semplicemente non è facile in C ++. In effetti, il mio file di intestazione qui è non un buon esempio di cosa fare quando hai effettivamente bisogno degli argomenti della riga di comando. Discuteremo più dettagliatamente le stringhe più avanti nel libro. Per ora, per prima cosa, ecco il file di intestazione:
Esempio: pchar.h
#pragma once #if! defined (_PCHAR_H) #define _PCHAR_H 1 #if definito (WIN32) && defined (UNICODE) #define _pmain wmain #define _pchar wchar_t #else #define _pmain main #define _pchar char #endif #endif
In secondo luogo, ecco come appare ora il punto di ingresso (ho omesso l'inclusione del file di intestazione qui):
int _pmain (int / * argc * /, _pchar * / * argv * / []) // Il tuo programma inizia qui. // Il ritorno 0 indica il successo. ritorno 0;
Come puoi vedere, i nomi dei parametri sono commentati (usando il commento in stile C, ad es. / * ... * /
). Questo è perfettamente legale in C ++ ed è qualcosa che dovresti fare ogni volta che hai una funzione che richiede determinati parametri, anche se potresti non voler usare quei parametri. Commentando i nomi dei parametri, ti assicuri che non li utilizzi accidentalmente.
Il codice in pchar.h ci fornisce un punto di ingresso ragionevolmente portatile, mentre il int _pmain (int, _pchar * [])
il punto di ingresso stesso garantisce che non useremo mai gli argomenti della riga di comando passati. Se hai bisogno degli argomenti della riga di comando, questa soluzione non funzionerà: avrai bisogno di una soluzione più avanzata e più complicata.
Io uso i termini discussione e parametro in vari punti di questo libro. Per me, un argomento è un valore che viene passato a una funzione quando viene chiamato in un programma, mentre un parametro fa parte delle specifiche di una funzione che dice al programmatore che la funzione si aspetta di ricevere un valore di un certo tipo. Inoltre dice al programmatore come potrebbe trattare quel valore. Un parametro tipicamente fornisce un nome con il quale si può fare riferimento a quel valore, sebbene il C ++ ci permetta di fornire solo un tipo se ci viene richiesto di avere un particolare parametro (ad es. Per abbinare una specifica di interfaccia) ma non si intende utilizzare effettivamente il suo valore.
Come esempio di un parametro rispetto a un argomento, in C # potresti avere un metodo di classe come void AddTwoNumbers (int a, int b, ref int result) result = a + b;
. In questo caso, un
, B
, e risultato
sono parametri; lo sappiamo AddTwoNumbers
potrebbe cambiare il valore dell'argomento passato per il risultato
parametro (come, anzi, lo fa). Se hai chiamato questo metodo in questo modo, int one = 1, two = 2, answer = 0; someClass.AddTwoNumbers (uno, due, ref risposta);
poi uno
, Due
, e risposta
sarebbero tutti argomenti passati a AddTwoNumbers
.
Gli esempi di codice in questo libro utilizzano i colori di evidenziazione della sintassi di Visual Studio 2012 Ultimate RC. Questo ti aiuterà a capire il codice, ma potrai anche leggerlo su un lettore di e-book monocromatico.
Gli esempi in questo libro sono disponibili su https://bitbucket.org/syncfusion/cpp_succinctly.
I campioni per questo libro sono stati progettati e sviluppati utilizzando Visual Studio 2012 Ultimate RC. Il compilatore C ++ fornito con VS 2012 include nuove funzionalità dello standard di linguaggio C ++ 11 che non sono state incluse in Visual Studio 2010. Nell'autunno del 2012, Microsoft pubblicherà una versione "Express" gratuita di Visual Studio 2012, che consentire agli sviluppatori di utilizzare applicazioni desktop mirate al C ++ (come l'applicazione console, utilizzata dagli esempi). Fino ad allora, per utilizzare appieno gli esempi, è necessaria una versione non Express di Visual Studio 2012.
Ho testato molti dei campioni lungo la strada usando Minimalist GNU per Windows (MinGW), quindi ci dovrebbe essere molta portabilità del cross-compilatore. L'unico esempio so per certo che non funziona come scritto con il compilatore GCC fornito da MinGW StorageDurationSample. Fa uso dell'estensione di lingua specifica di Microsoft _declspec (filo)
per simulare thread_local
Conservazione. GCC ha la sua estensione molto simile, e anche altri produttori di compilatori lo fanno senza dubbio, quindi se lo sostituisci con il codice appropriato per il compilatore che decidi di usare, dovrebbe quindi compilare ed eseguire.
Infine, i campioni sono tutti campioni di console. Ho scelto gli esempi di console in modo da evitare tutto il codice estraneo che viene fornito con la creazione e la visualizzazione di finestre all'interno di un ambiente con finestre. Per vedere l'output di un particolare campione, puoi impostare un punto di interruzione su ritorno
dichiarazione alla fine del _pmain
funzione e quindi eseguirlo utilizzando il debugger di Visual Studio, oppure è possibile eseguirlo utilizzando il Inizia senza debug comando nel mettere a punto menu in Visual Studio (in genere utilizza la scorciatoia da tastiera Ctrl + F5). È inoltre necessario assicurarsi che il progetto che si desidera eseguire sia impostato come progetto di avvio. È possibile farlo facendo clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni e quindi facendo clic con il pulsante sinistro del mouse su Imposta come progetto di avvio nel menu di scelta rapida che appare.
Nel 2011, una nuova versione principale dello standard di linguaggio C ++ è stata adottata dal gruppo di lavoro ISO / IEC responsabile della progettazione e dello sviluppo del C ++ come lingua. Se confrontato con C ++ 98 e C ++ 03, C ++ 11 si sente come una lingua diversa. Perché C ++ 11 è così nuovo, non ci sono compilatori che supportano ogni singola funzione, e ce ne sono alcuni che supportano meno di altri. Ho preso di mira Visual C ++ e le funzionalità implementate nella sua versione più recente (Visual Studio 2012 RC al momento della stesura di questo documento), anche se ho menzionato alcune funzionalità che Visual C ++ attualmente non supporta e che hanno evidenziato quando appropriato.
È improbabile che Visual C ++ cambi molto tra Visual Studio 2012 RC e Visual Studio 2012 RTM. È in programma un aggiornamento fuori banda, che aggiungerà ulteriore supporto per la lingua C ++ 11, a volte dopo la pubblicazione di RTM. Dal momento che non posso predire quali funzionalità verranno aggiunte e non avremo alcuna conoscenza approfondita al riguardo, per lo più non ho trattato argomenti che non sono supportati nella RC.
Se hai precedenti esperienze con C ++ di cinque anni fa, o forse più a lungo, è probabile che tu ne rimanga molto piacevolmente sorpreso, il che non vuol dire che abbia tutto ciò che C # ha.
Ci sono funzionalità di C # e .NET che mi mancano quando si lavora in C ++. Ma ci sono anche caratteristiche del C ++ che mi mancano quando si lavora in C #. Mi manca la semplicità del casting in C # che il sistema di tipo CLR fornisce quando lavoro in C ++. Mi manca anche il set completo di eccezioni di .NET e il più frequente IntelliSense fornito da .NET. In C ++, mi trovo a riferire alla documentazione molto più che in C # per capire cose come i valori degli argomenti che posso e dovrei passare ad una particolare funzione, e quali valori aspettarci da esso.
Quando lavoro in C #, mi manca la larghezza che forniscono le diverse durate di memorizzazione del C ++. In C #, la maggior parte delle cose finisce semplicemente nell'heap gestito da GC, il che semplifica enormemente la gestione della memoria. Ma a volte non voglio necessariamente che un'istanza di classe sia sullo heap. In C #, non ho altra scelta che riscrivere la classe come una struttura; mentre in C ++, posso facilmente scegliere tra i due senza dover cambiare la definizione della classe stessa. Mi mancano anche le funzioni autonome (anche se possono essere in gran parte emulati con metodi statici in classi statiche in C #). Mi piace anche che i miei programmi C ++ finiscano come codice macchina fortemente ottimizzato (e quindi difficile da capire) quando li compilo, quindi non ho davvero bisogno di preoccuparmi di cercare di offuscare i miei programmi se voglio che il mio codice rimanga segreto ( come faccio con .NET, anche se ci sono alcuni ottimi strumenti di offuscamento là fuori).
Ogni lingua prende di mira la propria serie di problemi e ha una sua storia e stranezze associate ad essa. Spero che troverai C ++ un linguaggio interessante e utile da aggiungere al tuo repertorio di programmazione.
Questa lezione rappresenta un capitolo di C ++, un eBook gratuito del team di Syncfusion.