C ++ Succinctly a fost scris pentru a ajuta dezvoltatorii C # profesioniști să învețe programarea C ++ modernă. Scopul acestei cărți este de a vă folosi cunoștințele C # existente pentru a vă extinde abilitățile. Indiferent dacă aveți nevoie să utilizați C ++ într-un proiect viitoare sau pur și simplu doriți să învățați o limbă nouă (sau să vă reacționați cu ea), această carte vă va ajuta să învățați toate piesele fundamentale ale C ++, astfel încât să puteți înțelege proiectele și mostrele scrise în C ++ și începe să vă scrieți propriile programe C ++.
Ca și în cazul oricărui subiect mare, pur și simplu nu a fost loc pentru a acoperi totul (un exemplu fiind noile caracteristici atomice adăugate în C ++ 11), iar altele ar fi decis să ordoneze subiectele în mod diferit. Mă gândesc în special la indicii, un subiect pe care eu îl aprofundez în profunzime doar în carte. Ele sunt importante, astfel încât unii ar fi putut alege să le acopere mai devreme, dar simt că nu trebuie să înțelegeți indicii pentru a înțelege materialul care precede acoperirea lor; înțelegerea subiectelor precedente vă va face mult mai ușor să le înțelegeți.
Am făcut tot posibilul pentru a fi cât mai exact posibil, fără să semnal ca o specificație de limbă sau un fișier de documentare. Sper că am reușit. Am consultat frecvent specificația limbajului C ++ 11 în timp ce scriu acest lucru, și am citit, de asemenea, totul, de la posturile StackOverflow, până la documentele MSDN, documentele GCC și dincolo. Există domenii în care am simplificat intenționat lucrurile. Pe măsură ce continuați să vă extindeți cunoștințele despre C ++, veți ajunge, fără îndoială, la probleme în care trebuie să aveți o înțelegere mai cuprinzătoare pentru a vă atinge obiectivul sau pentru a elimina o eroare. Dacă citiți această carte conferă suficiente cunoștințe - și o simțire suficient de bună pentru limba pe care o puteți recunoaște, diagnostica și rezolva aceste probleme - atunci voi fi mulțumit că am reușit în obiectivele mele. Bine ați venit la C++!
Fiind un avocat pensionar, mă simt obligat să includ această scurtă secțiune, despre care probabil nu-ți pasă dacă nu ești un avocat pentru una dintre aceste companii sau organizații. Restul acestei prefațe este o citire mult mai plăcută pentru non-avocați, deci vă rugăm să nu lăsați asta să vă scape. Microsoft®, Visual Studio®, Visual C ++®, Visual C #®, Windows®, Windows NT®, Win32®, MSDN®, Silverlight®, DirectX® și IntelliSense® sunt mărci comerciale înregistrate ale Microsoft Corporation. GNU® este o marcă înregistrată a Fundației pentru Software Liber. ISO® este o marcă de serviciu înregistrată a Organizației Internaționale de Standardizare. IEC® este o marcă de serviciu înregistrată a International Engineering Consortium, Inc. Unicode® este o marcă de serviciu înregistrată a Unicode, Inc. (a.k.a. Unicode Consortium). Intel® este o marcă comercială înregistrată a Intel Corporation. Alte mărci comerciale și mărci de servicii sunt proprietățile proprietarilor lor.
În C #, punctul de intrare pentru un program este o metodă statică denumită Principal
. De multe ori nu veți vedea de fapt, deoarece diferite cadre oferă propriile lor (de exemplu, Silverlight), dar este acolo, undeva, deoarece fără ea sistemul de operare nu ar ști unde să înceapă executarea programului.
Punctul de intrare al unui program C ++ este principal
funcţie. O versiune simplă arată astfel:
int main (int argc, char * argv []) // Programul dvs. începe aici. // Revenirea 0 înseamnă succes. retur 0;
Parametrii sunt numărul de argumente urmat de o serie de argumente ale liniei de comandă (ca șiruri de caractere). În programarea Windows, veți vedea adesea acest lucru ca punct de intrare:
int wmain (int argc, wchar_t * argv []) // Programul dvs. începe aici. // Revenirea 0 înseamnă succes. retur 0;
Acest wmain
punctul de intrare este specific Microsoft. Este folosit ca punct de intrare pentru programele Windows Unicode (spre deosebire de programele vechi ASCII / paginile de cod). Sistemele de operare Microsoft care acceptă unicode (totul de la Windows 2000 și Windows NT 4, și chiar sistemele bazate pe Win 9X când instalați un add-on special) utilizează codarea UTF-16. Ca atare, într-adevăr trebuie să utilizați întotdeauna Unicode când scrieți programele, decât dacă aveți absolut nevoie să susțineți sisteme mai vechi care nu au suport Unicode.
De asemenea, veți vedea frecvent acest lucru ca punct de intrare pentru programele Windows:
#includeint _tmain (int argc, _TCHAR * argv []) // Programul dvs. începe aici. // Revenirea 0 înseamnă succes. retur 0;
SDK-ul Windows oferă tchar.h antet, pe care îl puteți folosi (și ar trebui) atunci când trebuie să construiți un proiect care va fi utilizat atât în versiunile Unicode, cât și în cele non-Unicode ale Windows. Nu o folosesc în eșantioane deoarece, în măsura în care este posibil, am vrut să fac probele portabile și compatibile cu standardele.
În schimb, am scris un mic fișier antet, pchar.h, care simplifică problema portabilității punctului de intrare. Acest lucru nu rezolvă majoritatea problemelor legate de portabilitate care apar atunci când se ocupă cu șiruri de caractere; din păcate, portabilitatea șirului este o zonă care pur și simplu nu este ușor în C ++. Într-adevăr, dosarul meu de antet este aici nu un bun exemplu de ce să faceți când aveți nevoie de argumentele liniei de comandă. Vom discuta șirurile cu mult mai multe detalii mai târziu în carte. Pentru moment, mai întâi, iată fișierul antet:
Mostră: pchar.h
#pragma o dată #if definit (_PCHAR_H) #define _PCHAR_H 1 #if definit (WIN32) && definit (UNICODE) #define _pmain wmain #define _pchar wchar_t #define #define _pmain principal #define _pchar char #endif #endif
În al doilea rând, iată cum arată acum punctul de intrare (am omis includerea fișierului antet aici):
int _pmain (int / * argc * /, _pchar * / * argv * / []) // Programul dvs. începe aici. // Revenirea 0 înseamnă succes. retur 0;
După cum puteți vedea, numele parametrilor sunt comentați (folosind comentariul în stil C,. / * ... * /
). Acest lucru este perfect legal în C ++ și este ceva ce ar trebui să faceți ori de câte ori aveți o funcție care trebuie să aibă anumiți parametri, deși este posibil să nu intenționați să utilizați acești parametri. Comentând numele parametrilor, vă asigurați că nu le veți folosi accidental.
Codul din pchar.h ne oferă un punct de intrare rezonabil portabil, în timp ce int _pmain (int, _pchar * [])
punctul de intrare însăși asigură faptul că nu vom folosi niciodată argumentele liniei de comandă transmise. Dacă aveți vreodată nevoie de argumentele liniei de comandă, atunci această soluție nu va funcționa - veți avea nevoie de o soluție mai avansată și mai complicată.
Folosesc termenii argument și parametru la diferite puncte din această carte. Pentru mine, un argument este o valoare care este transmisă unei funcții atunci când este apelată într-un program, în timp ce un parametru face parte din specificația unei funcții care îi spune programatorului că funcția așteaptă să primească o valoare de un anumit tip. De asemenea, îi spune programatorului modul în care ar putea trata această valoare. Un parametru oferă în mod obișnuit un nume prin care această valoare poate fi menționată, deși C ++ ne permite să furnizăm doar un tip dacă suntem obligați să avem un anumit parametru (de exemplu, pentru a se potrivi cu o specificație a interfeței), dar nu intenționați să folosiți valoarea sa.
Ca exemplu de parametru versus un argument, în C # este posibil să aveți o metodă de clasă, cum ar fi void AddTwoNumbers (int a, int b, rezultatul ref int) result = a + b;
. În acest caz, A
, b
, și rezultat
sunt parametri; noi stim aia AddTwoNumbers
ar putea schimba valoarea argumentului trecut pentru rezultat
parametru (așa cum o face, într-adevăr). Dacă ați numit această metodă ca atare, int una = 1, două = 2, răspuns = 0; someClass.AddTwoNumbers (unul, doi, răspuns ref);
atunci unu
, Două
, și Răspuns
ar fi toate argumentele trecute la AddTwoNumbers
.
Exemplele de cod din această carte utilizează culorile care evidențiază sintaxa din Visual Studio 2012 Ultimate RC. Acest lucru vă va ajuta să înțelegeți codul, dar veți fi, de asemenea, bine să citiți acest lucru pe un cititor de e-book monocrom.
Mostrele din această carte sunt disponibile la adresa https://bitbucket.org/syncfusion/cpp_succinctly.
Probele pentru această carte au fost proiectate și dezvoltate utilizând Visual Studio 2012 Ultimate RC. Compilatorul C ++ care vine cu VS 2012 include noi caracteristici ale standardului de limbă C ++ 11 care nu au fost incluse în Visual Studio 2010. În toamna anului 2012, Microsoft va lansa o versiune gratuită "Express" a Visual Studio 2012, care va permite dezvoltatorilor să utilizeze aplicații desktop direcționate C ++ (cum ar fi aplicația consola, pe care le utilizează eșantioanele). Până atunci, pentru a utiliza în întregime mostrele, veți avea nevoie de o versiune non-Express a Visual Studio 2012.
Am testat multe dintre mostre de-a lungul drumului folosind Minimalist GNU pentru Windows (MinGW), deci ar trebui să existe o mulțime de portabilitate încrucișată. Singurul exemplu pe care îl știu cu siguranță că nu funcționează așa cum este scris cu compilatorul GCC pe care îl oferă MinGW StorageDurationSample. Folosește extensia de limbă specifică Microsoft _declspec (filet)
pentru a simula thread_local
depozitare. GCC are o extensie foarte asemănătoare, iar alți furnizori de compilatoare fac, fără îndoială, și ei, deci, dacă îl înlocuiți cu codul corespunzător pentru compilatorul pe care îl decideți să îl utilizați, ar trebui să compilați și să executați.
În cele din urmă, mostrele sunt toate eșantioane de consolă. Am ales mostrele de consolă pentru a evita codul străin care vine cu crearea și afișarea ferestrelor într-un mediu de ferestre. Pentru a vedea rezultatul unei anumite mostre, puteți seta un punct de întrerupere pe întoarcere
declarație la sfârșitul anului _pmain
apoi rulați-l utilizând programul de depanare Visual Studio sau îl puteți executa utilizând Porniți fără depanare comandă în debug în Visual Studio (de obicei, aceasta utilizează comanda rapidă de la tastatură Ctrl + F5). De asemenea, trebuie să vă asigurați că proiectul pe care doriți să-l executați este setat ca proiect de pornire. Puteți realiza acest lucru făcând clic dreapta pe numele proiectului din Solution Explorer și apoi făcând clic stânga pe Setați ca proiect de pornire în meniul contextual care apare.
În 2011, o nouă versiune majoră a standardului de limbă C ++ a fost adoptată de grupul de lucru ISO / IEC responsabil pentru proiectarea și dezvoltarea limbajului C ++. În comparație cu C ++ 98 și C ++ 03, C ++ 11 se simte ca o altă limbă. Deoarece C ++ 11 este atât de nou, nu există compilatoare care să suporte fiecare caracteristică, și există unele care suportă mai puțin decât altele. Am vizat Visual C ++ și caracteristicile pe care le implementează în cea mai recentă versiune (Visual Studio 2012 RC la momentul acestei scrieri), deși am menționat câteva caracteristici pe care Visual C ++ nu le suportă în prezent și care au indicat acest lucru atunci când este cazul.
Este puțin probabil ca Visual C ++ să se schimbe mult între Visual Studio 2012 RC și Visual Studio 2012 RTM. Există planuri de realizare a unei actualizări în afara benzii, care va adăuga suport suplimentar pentru limbajul C ++ 11, uneori după lansarea RTM. Din moment ce nu pot anticipa ce caracteristici vor fi adăugate și nu au nici o cunoaștere internă despre aceasta, am mai mult nu acoperă lucruri care nu sunt suportate în RC.
Dacă aveți experiență anterioară cu C ++ de acum cinci ani sau poate mai mult, probabil că veți fi foarte plăcut surprinși - ceea ce nu înseamnă că are tot ce are C #.
Există caracteristici ale C # și .NET pe care mi le lipsește când lucrez în C ++. Dar există, de asemenea, caracteristici ale C ++ pe care mi-e dor de când lucrez în C #. Mi-e dor de simplitatea turnării în C # pe care sistemul de tip CLR îl oferă atunci când lucrez în C ++. Imi ratez, de asemenea, setul .NET de exceptii mai plin si IntelliSense frecvent mai bine pe care .NET le ofera. În C ++, mă găsesc referindu-mă la documentație mult mai mult decât în C # pentru a descoperi lucruri cum ar fi ce valori de argument pot și ar trebui să trec la o anumită funcție și ce valori să mă aștept din nou.
Când lucrez în C #, îmi pare lipsit de lățimea pe care o oferă durata de depozitare a lui C ++. În C #, cele mai multe lucruri se termină doar pe gașca gestionată de GC, ceea ce simplifică foarte mult gestionarea memoriei. Dar, uneori, nu vreau neapărat ca o instanță de clasă să fie pe masă. În C #, nu am de ales decât să rescriu clasa ca o structură; în timp ce în C ++, pot alege cu ușurință între cele două, fără a fi nevoie să modificăm definiția clasei. Mi-e dor de asemenea funcții independente (chiar dacă ele pot fi mai mult emulate cu metode statice în clase statice în C #). De asemenea, îmi place că programele mele C ++ se termină ca un cod de mașină puternic optimizat (și astfel greu de înțeles) atunci când le compilez, deci nu trebuie să-mi fac griji pentru a încerca să-mi încurc programe dacă vreau ca codul meu să rămână secret la fel ca și cu .NET, deși există unele instrumente de obfuscare foarte bune acolo).
Fiecare limbă își propune propriul set de probleme și are propria istorie și ciudățenii asociate cu ea. Sperăm că veți găsi C ++ un limbaj interesant și util pentru a vă adăuga repertoriul de programare.
Această lecție reprezintă un capitol din C ++ Succinctly, o carte electronică gratuită de la echipa de la Syncfusion.