C ++ Succinctly ble skrevet for å hjelpe profesjonelle C # utviklere lære moderne C ++ programmering. Målet med denne boken er å utnytte din eksisterende C # kunnskap for å utvide dine ferdigheter. Enten du trenger å bruke C ++ i et kommende prosjekt, eller bare vil lære et nytt språk (eller gjenkjenne deg selv), vil denne boken hjelpe deg med å lære alle de grunnleggende delene av C ++ slik at du kan forstå prosjekter og prøver skrevet i C ++ og begynn å skrive dine egne C ++-programmer.
Som med ethvert stort emne, var det ganske enkelt ikke plass til å dekke alt (et eksempel er de nye atomegenskapene i C + + 11), og andre har kanskje bestemt å bestille emnene på en annen måte. Jeg tenker spesielt på pekere, et emne som jeg dekker i dybden bare lenger inn i boken. De er viktige, slik at noen kanskje har valgt å dekke dem tidligere, men jeg føler at du ikke trenger å forstå pointers for å forstå materialet som ligger foran dekningene sine. Å forstå de foregående emnene vil gjøre det mye lettere for deg å forstå dem.
Jeg har gjort mitt beste for å være så nøyaktig som mulig uten å høres ut som en språkspesifikasjon eller dokumentasjonsfil. Jeg håper jeg har lyktes. Jeg konsulterte C ++ 11-språkspesifikasjonen ofte mens jeg skriver dette, og jeg leser alt fra StackOverflow-innlegg, til MSDN-dokumenter, til GCC-dokumenter, og utover. Det er områder hvor jeg med vilje forenklet ting. Som du fortsetter å utvide din kunnskap om C ++, vil du utvilsomt nå problemer der du trenger å få en mer omfattende forståelse for å oppnå målet eller eliminere en feil. Hvis du leser denne boken, gir du nok kunnskap og en god nok følelse for språket du kan gjenkjenne, diagnostisere og løse disse problemene, så vil jeg være tilfreds med at jeg har lykkes i mine mål. Velkommen til C++!
Å være en pensjonert advokat, føler meg tvunget til å inkludere denne korte delen, som du sannsynligvis ikke bryr seg om med mindre du er advokat for et av disse selskapene eller organisasjonene. Resten av dette forordet er mye morsommere å lese for ikke-advokater, så vær så snill ikke la dette sette deg av. Microsoft®, Visual Studio®, Visual C ++ ®, Visual C # ®, Windows®, Windows NT®, Win32®, MSDN®, Silverlight®, DirectX® og IntelliSense® er registrerte varemerker for Microsoft Corporation. GNU® er et registrert varemerke for Free Software Foundation. ISO® er et registrert servicemerk av Den internasjonale organisasjonen for standardisering. IEC® er et registrert servicemerk av International Engineering Consortium, Inc. Unicode® er et registrert servicemerk av Unicode, Inc. (a.c. Unicode Consortium). Intel® er et registrert varemerke for Intel Corporation. Andre varemerker og servicemerker er egenskapene til de respektive eiere.
I C # er inngangspunktet for et program en statisk metode som heter Hoved
. Ofte ser du ikke det da ulike rammer gir sine egne (for eksempel Silverlight), men det er der, et sted, siden uten det, ville operativsystemet ikke vite hvor du skal begynne å utføre programmet ditt.
Inngangspunktet for et C ++-program er hoved-
funksjon. En enkel versjon ser slik ut:
int main (int argc, char * argv []) // Ditt program starter her. // Retur 0 betyr suksess. returner 0;
Parametrene er argumenttellingen etterfulgt av en rekke kommandolinjeparametere (som strenge). I Windows programmering vil du ofte se dette som inngangspunkt:
int wmain (int argc, wchar_t * argv []) // Ditt program starter her. // Retur 0 betyr suksess. returner 0;
Dette wmain
inngangspunkt er Microsoft-spesifikk. Den brukes som inngangspunkt for Windows Unicode-programmer (i motsetning til eldre ASCII- / kodesider). Microsoft-operativsystemer som støtter Unicode (alt fra Windows 2000 og Windows NT 4 på, og til og med Win 9X-baserte systemer når du installerer et spesielt tillegg), bruker UTF-16-koding. Som sådan bør du alltid bruke Unicode når du skriver programmer, med mindre du absolutt trenger å støtte eldre systemer som ikke har Unicode-støtte.
Du vil også ofte se dette som inngangspunkt for Windows-programmer:
#inkludereint _tmain (int argc, _TCHAR * argv []) // Ditt program starter her. // Retur 0 betyr suksess. returner 0;
Windows SDK gir tchar.h header-fil, som du kan (og bør) bruke når du trenger å bygge et prosjekt som skal brukes på både Unicode og ikke-Unicode-versjoner av Windows. Jeg bruker ikke den i prøvene fordi, i det omfang det var mulig, ønsket jeg å gjøre prøvene bærbare og standardkompatible.
I stedet har jeg skrevet en liten headerfil, pchar.h, noe som forenkler inngangspartialportabilitetsproblemet. Dette løser ikke de fleste bærbarhetsproblemer som kaster seg opp når man håndterer strenge; Dessverre er strengportabilitet et område som ganske enkelt ikke er lett i C ++. Faktisk er min overskriftsfil her ikke et godt eksempel på hva du skal gjøre når du faktisk trenger kommandolinjeprinsene. Vi vil diskutere strengene i mye mer detalj senere i boken. For nå, først, her er headerfilen:
Eksempel: pchar.h
#pragma en gang #if! definert (_PCHAR_H) #define _PCHAR_H 1 #if definert (WIN32) && definert (UNICODE) #define _pmain wmain #define _pchar wchar_t #else #define _pmain main #define _pchar char #endif #endif
For det andre, her er hva inngangspunktet nå ser ut (jeg har utelatt inkluderingen av headerfilen her):
int _pmain (int / * argc * /, _pchar * / * argv * / []) // Ditt program starter her. // Retur 0 betyr suksess. returner 0;
Som du kan se, blir parameternavnene kommentert (med C-stilkommentaren, dvs.. / * ... * /
). Dette er helt lovlig i C ++ og er noe du bør gjøre når du har en funksjon som kreves for å ha visse parametere, selv om du kanskje ikke har tenkt å bruke disse parameterne. Ved å kommentere parameternavnene, sørger du for at du ikke vil bruke dem ved et uhell.
Koden i pchar.h gir oss et rimelig bærbart inngangspunkt, mens int _pmain (int, _pchar * [])
Inngangspunktet i seg selv sikrer at vi aldri vil bruke kommandolinjens argumenter. Hvis du noen gang trenger kommandolinjeparametrene, vil denne løsningen ikke fungere - du vil trenge en mer avansert og mer komplisert løsning.
Jeg bruker vilkårene argument og parameter på forskjellige punkter i denne boken. For meg er et argument en verdi som sendes inn i en funksjon når det blir innkalt i et program, mens en parameter er en del av spesifikasjonen av en funksjon som forteller programmereren at funksjonen forventer å motta en verdi av en bestemt type. Det forteller også programmerer hvordan det kan behandle den verdien. En parameter gir vanligvis et navn som den verdien kan refereres til, selv om C ++ tillater oss å gi bare en type hvis vi må ha en bestemt parameter (for eksempel for å matche en grensesnittspesifikasjon), men har ikke tenkt å faktisk bruke sin verdi.
Som et eksempel på en parameter versus et argument, i C # kan du ha en klassemetode som void AddTwoNumbers (int a, int b, ref int resultat) result = a + b;
. I dette tilfellet, en
, b
, og resultat
er parametere; vi vet det AddTwoNumbers
kan endre verdien av argumentet som er sendt inn for resultat
parameter (som det faktisk gjør). Hvis du kalte denne metoden som sådan, int en = 1, to = 2, svar = 0; someClass.AddTwoNumbers (ett, to, ref svar);
deretter en
, to
, og svar
ville alle være argumenter sendt inn til AddTwoNumbers
.
Kodeksemplene i denne boken bruker syntaksfargerfarger fra Visual Studio 2012 Ultimate RC. Dette vil hjelpe deg å forstå koden, men du vil også være i orden å lese dette på en monokrom e-bokleser.
Prøvene i denne boken er tilgjengelig på https://bitbucket.org/syncfusion/cpp_succinctly.
Prøvene for denne boken ble designet og utviklet ved hjelp av Visual Studio 2012 Ultimate RC. C ++-kompilatoren som leveres med VS 2012, inneholder nye funksjoner i C ++ 11-språkstandarden som ikke var inkludert i Visual Studio 2010. Høsten 2012 vil Microsoft utgive en gratis "Express" -versjon av Visual Studio 2012 som vil la utviklere bruke C ++-målrettede skrivebordsprogrammer (for eksempel konsollprogrammet, som prøvene bruker). Inntil da, for å få full bruk av prøvene, trenger du en ikke-Express-versjon av Visual Studio 2012.
Jeg testet mange av prøvene underveis ved hjelp av minimalistisk GNU for Windows (MinGW), så det burde være mye kryssompilatorportabilitet. Den ene prøven jeg sikkert vet, fungerer ikke som skrevet med GCC-kompilatoren som MinGW tilbyr StorageDurationSample. Den benytter seg av den Microsoft-spesifikke språkutvidelsen _declspec (tråd)
for å simulere thread_local
Oppbevaring. GCC har sin egen svært liknende forlengelse, og andre kompilatorselgere utvilsomt gjør også, så hvis du erstatter det med den riktige koden for kompilatoren du bestemmer deg for å bruke, bør den kompilere og løpe.
Til slutt er prøvene alle konsollprøver. Jeg valgte konsollprøver, slik at vi kunne unngå all ekstern kode som kommer med å skape og vise vinduer i et vinduesvindu. For å se utgangen av en bestemt prøve, kan du enten sette et brytepunkt på komme tilbake
uttalelse på slutten av _pmain
funksjon og kjør det ved hjelp av Visual Studio debugger, eller du kan kjøre den ved hjelp av Start uten debugging kommando i Debug menyen i Visual Studio (vanligvis bruker dette Ctrl + F5-hurtigtasten). Du må også sørge for at prosjektet du ønsker å kjøre er satt som oppstartsprosjekt. Du kan oppnå dette ved å høyreklikke på prosjektets navn i Solution Explorer og deretter venstre-klikke på Sett som oppstartsprosjekt i kontekstmenyen som vises.
I 2011 ble en ny hovedversjon av C ++-språkstandarden vedtatt av ISO / IEC-arbeidsgruppen som var ansvarlig for utformingen og utviklingen av C ++ som språk. Når det sammenlignes med C ++ 98 og C ++ 03, føles C ++ 11 som et annet språk. Fordi C + + 11 er så ny, er det ingen kompilatorer som støtter hver enkelt funksjon, og det er noen som støtter mindre enn andre. Jeg har målrettet Visual C ++ og funksjonene den implementerer i sin nyeste versjon (Visual Studio 2012 RC på tidspunktet for denne skrivingen), selv om jeg har nevnt noen få funksjoner som Visual C ++ for øyeblikket ikke støtter og har pekt på dette når det passer.
Det er usannsynlig at Visual C ++ vil forandres mye mellom Visual Studio 2012 RC og Visual Studio 2012 RTM. Det er planer om å gjøre en oppdatering utenom bandet, som vil legge til ekstra C ++ 11 språkstøtte, en gang etter at RTM er utgitt. Siden jeg ikke kan forutsi hvilke funksjoner som skal legges til og ikke har noen innvendig kunnskap om det, dekker jeg stort sett ikke ting som ikke støttes i RC.
Hvis du har tidligere erfaring med C ++ fra fem år siden, eller kanskje lengre, vil du sannsynligvis bli veldig hyggelig overrasket - som ikke er å si at den har alt C # har.
Det finnes funksjoner av C # og .NET som jeg savner når jeg jobber i C ++. Men det er også funksjoner av C ++ som jeg savner når jeg jobber i C #. Jeg savner enkelheten av støping i C # som CLRs typesystem gir når jeg jobber i C ++. Jeg savner også. NETs fullere sett med unntak og den ofte bedre IntelliSense som. NET gir. I C ++ finner jeg meg selv å referere til dokumentasjon mye mer enn i C # for å finne ut ting som hvilke argumentverdier jeg kan og skal passere til en bestemt funksjon, og hvilke verdier som kan forventes tilbake fra det.
Når jeg jobber i C #, finner jeg at jeg mangler bredden som C ++ 's forskjellige lagringsvarighet gir. I C # kommer de fleste ting bare opp på den GC-administrerte bunken, noe som forenkler minnehåndteringen sterkt. Men noen ganger vil jeg ikke nødvendigvis ha en klasseeksempel å være på bunken. I C # har jeg ikke annet valg enn å omskrive klassen som en struktur; mens i C ++, kan jeg enkelt velge mellom de to uten å måtte endre klassedepartementet selv. Jeg savner også frittstående funksjoner (selv om de mest kan emuleres med statiske metoder i statiske klasser i C #). Jeg liker også at min C ++-programmer ende opp som tungt optimalisert (og dermed vanskelig å forstå) maskinkode når jeg kompilerer dem, så jeg trenger egentlig ikke å bekymre meg for å prøve å forvirre mine programmer hvis jeg vil at min kode skal forbli hemmelig som jeg gjør med. NET, selv om det er noen veldig gode obfuscation verktøy der ute).
Hvert språk retter sitt eget sett med problemer og har sin egen historie og kjennskap knyttet til den. Forhåpentligvis vil du finne C ++ et interessant og nyttig språk for å legge til programmeringsrepertoaret ditt.
Denne leksjonen representerer et kapittel fra C ++ Succinctly, en gratis eBok fra teamet på Syncfusion.