C ++ Kort gezegd introductie

Invoering

C ++ Kort samengevat om professionele C # -ontwikkelaars te helpen modern C ++ -programma's te leren. Het doel van dit boek is om gebruik te maken van je bestaande C # -kennis om je vaardigheden uit te breiden. Of je nu C ++ in een aankomend project wilt gebruiken, of gewoon een nieuwe taal wilt leren (of jezelf opnieuw leert kennen), dit boek zal je helpen alle fundamentele stukken van C ++ te leren, zodat je projecten en voorbeelden die in C ++ geschreven zijn, kunt begrijpen en begin met het schrijven van je eigen C ++ -programma's.

Zoals bij elk groot onderwerp, was er eenvoudigweg niet ruimte om alles te bespreken (een voorbeeld is de nieuwe atomaire functies toegevoegd in C ++ 11), en anderen hebben besloten de onderwerpen anders te ordenen. Ik denk in het bijzonder aan wijzers, een onderwerp dat ik in de diepte alleen maar verder in het boek behandel. Ze zijn belangrijk, dus sommigen hebben er misschien voor gekozen om ze eerder te behandelen, maar ik heb het gevoel dat je geen pointers hoeft te begrijpen om het materiaal te begrijpen dat aan hun dekking voorafgaat; het begrijpen van de voorgaande onderwerpen maakt het veel gemakkelijker voor u om ze te begrijpen.

Ik heb mijn best gedaan om zo nauwkeurig mogelijk te zijn zonder te klinken als een taalspecificatie of documentatiebestand. Ik hoop dat het me gelukt is. Ik heb de C ++ 11-taalspecificatie regelmatig geraadpleegd tijdens het schrijven van dit en ik las ook alles van StackOverflow-berichten, naar MSDN-documenten, naar GCC-documenten en nog veel meer. Er zijn gebieden waar ik opzettelijk dingen heb vereenvoudigd. Terwijl je doorgaat met het uitbreiden van je kennis van C ++, zul je ongetwijfeld problemen tegenkomen waar je meer begrip nodig hebt om je doel te bereiken of een bug te elimineren. Als het lezen van dit boek genoeg kennis oplevert - en een goed gevoel geeft voor de taal die je in staat bent om die problemen te herkennen, te diagnosticeren en op te lossen - dan zal ik tevreden zijn dat ik erin geslaagd ben mijn doelen te bereiken. Welkom bij C++!


Handelsmerken, enz.

Als gepensioneerde advocaat voel ik me verplicht om deze korte sectie op te nemen, waar je waarschijnlijk niet om geeft, tenzij je een advocaat bent voor een van deze bedrijven of organisaties. De rest van dit voorwoord is veel leuker voor niet-juristen, dus laat dit je niet afschrikken. Microsoft®, Visual Studio®, Visual C ++ ®, Visual C # ®, Windows®, Windows NT®, Win32®, MSDN®, Silverlight®, DirectX® en IntelliSense® zijn geregistreerde handelsmerken van Microsoft Corporation. GNU® is een geregistreerd handelsmerk van de Free Software Foundation. ISO® is een geregistreerd servicemerk van de International Organization for Standardization. IEC® is een geregistreerd servicemerk van International Engineering Consortium, Inc. Unicode® is een geregistreerd servicemerk van Unicode, Inc. (ook bekend als het Unicode-consortium). Intel® is een gedeponeerd handelsmerk van Intel Corporation. Andere handelsmerken en servicemerken zijn eigendom van hun respectievelijke eigenaren.


Beginpunt van het programma

In C # is het toegangspunt voor een programma een statische methode met de naam Hoofd. Vaak zul je het niet zien, omdat verschillende frameworks hun eigen (bijv. Silverlight) bieden, maar het is er ergens, want zonder dat zou het besturingssysteem niet weten waar je je programma moet gaan uitvoeren..

Het beginpunt van een C ++ - programma is de hoofd functie. Een eenvoudige versie ziet er als volgt uit:

int main (int argc, char * argv []) // Uw programma begint hier. // Terugkeren 0 betekent succes. retourneer 0; 

De parameters zijn de argumententelling gevolgd door een array van de opdrachtregelargumenten (als tekenreeksen). In Windows-programmering ziet u dit vaak als het beginpunt:

int wmain (int argc, wchar_t * argv []) // Uw programma begint hier. // Terugkeren 0 betekent succes. retourneer 0; 

Deze wmain toegangspunt is Microsoft-specifiek. Het wordt gebruikt als het toegangspunt voor Windows Unicode-programma's (in tegenstelling tot oudere ASCII / codepagioprogramma's). Microsoft-besturingssystemen die Unicode ondersteunen (alles vanaf Windows 2000 en Windows NT 4 en zelfs Win 9X-systemen wanneer u een speciale invoegtoepassing installeert) maken gebruik van UTF-16-codering. Als zodanig moet je echt altijd Unicode gebruiken bij het schrijven van je programma's, tenzij je absoluut oudere systemen moet ondersteunen die geen Unicode-ondersteuning hebben.

U zult dit ook vaak zien als het toegangspunt voor Windows-programma's:

#include  int _tmain (int argc, _TCHAR * argv []) // Uw programma begint hier. // Terugkeren 0 betekent succes. retourneer 0; 

De Windows SDK biedt de tchar.h header-bestand, dat u kunt (en moet) gebruiken wanneer u een project moet bouwen dat zal worden gebruikt in zowel Unicode- als niet-Unicode-versies van Windows. Ik gebruik het niet in de monsters omdat ik, voor zover mogelijk, de monsters draagbaar en standaarden-compatibel wilde maken.

In plaats daarvan heb ik een klein header-bestand geschreven, pchar.h, Dit vereenvoudigt het probleem van de portabiliteit. Dit is geen oplossing voor de meeste problemen met de portabiliteit die zich voordoen bij het omgaan met strings; helaas is stringportabiliteit een gebied dat eenvoudigweg niet gemakkelijk is in C ++. Inderdaad, mijn header-bestand is hier niet een goed voorbeeld van wat te doen als je de commandoregelargumenten eigenlijk nodig hebt. We zullen strings later in het boek in meer detail bespreken. Voor nu, ten eerste, hier is het header-bestand:

Voorbeeld: pchar.h

#pragma eenmaal #if! gedefinieerd (_PCHAR_H) #define _PCHAR_H 1 #if gedefinieerd (WIN32) && gedefinieerd (UNICODE) #define _pmain wmain #define _pchar wchar_t #else #define _pmain main #define _pchar char #endif #endif

Ten tweede, hier is hoe het startpunt er nu uitziet (ik heb de toevoeging van het header-bestand hier weggelaten):

int _pmain (int / * argc * /, _pchar * / * argv * / []) // Uw programma begint hier. // Terugkeren 0 betekent succes. retourneer 0; 

Zoals u kunt zien, worden de parameternamen becommentarieerd (met behulp van de opmerking in de C-stijl, d.w.z.. / * ... * /). Dit is volkomen legaal in C ++ en het is iets dat je zou moeten doen wanneer je een functie hebt die vereist is om bepaalde parameters te hebben, hoewel je misschien niet van plan bent om die parameters te gebruiken. Door de parameternamen uit te geven, zorgt u ervoor dat u ze niet per ongeluk gebruikt.

De code in pchar.h geeft ons een redelijk draagbaar toegangspunt, terwijl het int _pmain (int, _pchar * []) startpunt zelf zorgt ervoor dat we nooit de doorgegeven commandoregelargumenten gebruiken. Als u ooit de opdrachtregelargumenten nodig hebt, dan werkt deze oplossing niet - u hebt een geavanceerdere, meer gecompliceerde oplossing nodig.


Argumenten en parameters

Ik gebruik de voorwaarden argument en parameter op verschillende punten in dit boek. Voor mij is een argument een waarde die wordt doorgegeven aan een functie wanneer deze wordt aangeroepen in een programma, terwijl een parameter deel uitmaakt van de specificatie van een functie die de programmeur vertelt dat de functie een waarde van een bepaald type verwacht te ontvangen. Het vertelt de programmeur ook hoe het die waarde zou kunnen behandelen. Een parameter biedt meestal een naam waarmee naar die waarde kan worden verwezen, hoewel C ++ ons in staat stelt om alleen een type op te geven als we een bepaalde parameter moeten hebben (bijvoorbeeld om aan een interfacespecificatie te voldoen) maar niet van plan zijn waarde daadwerkelijk te gebruiken.

Als een voorbeeld van een parameter versus een argument, kunt u in C # een klassemethode gebruiken zoals void AddTwoNumbers (int a, int b, ref int result) result = a + b; . In dit geval, een, b, en resultaat zijn parameters; we weten dat AddTwoNumbers kan de waarde van het argument wijzigen dat is doorgegeven voor de resultaat parameter (zoals inderdaad het geval is). Als je deze methode zo noemde, int one = 1, two = 2, answer = 0; someClass.AddTwoNumbers (één, twee, antwoord antwoorden); dan een, twee, en antwoord zouden alle argumenten worden doorgegeven aan AddTwoNumbers.


Syntaxis Markeren

De codevoorbeelden in dit boek gebruiken de syntaxiskleurende kleuren van Visual Studio 2012 Ultimate RC. Dit zal u helpen de code te begrijpen, maar u zult dit ook prima lezen op een monochrome e-book reader.


samples

De voorbeelden in dit boek zijn beschikbaar op https://bitbucket.org/syncfusion/cpp_succinctly.

De voorbeelden voor dit boek zijn ontworpen en ontwikkeld met behulp van Visual Studio 2012 Ultimate RC. De C ++ -compiler die bij VS 2012 wordt geleverd, bevat nieuwe functies van de C ++ 11-taalstandaard die niet waren opgenomen in Visual Studio 2010. In de herfst van 2012 zal Microsoft een gratis "Express" -versie van Visual Studio 2012 uitbrengen, die ontwikkelaars toestaan ​​om C ++ gerichte bureaubladtoepassingen te gebruiken (zoals de console-applicatie, die de voorbeelden gebruiken). Tot die tijd hebt u voor een volledig gebruik van de voorbeelden een niet-Express-versie van Visual Studio 2012 nodig.

Ik heb onderweg veel van de samples getest met behulp van Minimalist GNU voor Windows (MinGW), dus er moet veel cross-compiler draagbaarheid zijn. Het enige voorbeeld dat ik zeker weet, werkt niet zoals geschreven met de GCC-compiler die MinGW levert StorageDurationSample. Het maakt gebruik van de Microsoft-specifieke taaluitbreiding _declspec (thread) om te simuleren thread_local opslag. GCC heeft zijn eigen zeer vergelijkbare extensie, en andere compiler-leveranciers doen dit ongetwijfeld ook, dus als je dat vervangt door de juiste code voor de compiler die je wilt gebruiken, moet deze compileren en uitvoeren.

Ten slotte zijn de voorbeelden allemaal consolemonsters. Ik koos console-samples, zodat we alle externe code konden vermijden die hoort bij het maken en weergeven van vensters binnen een vensteromgeving. Om de uitvoer van een bepaald monster te bekijken, kunt u een breekpunt instellen op de terugkeer verklaring aan het einde van de _pmain functie en voer het vervolgens uit met de Visual Studio-foutopsporing, of u kunt het uitvoeren met behulp van de Start zonder foutopsporing commando in de debug menu in Visual Studio (meestal wordt hiervoor de sneltoets Ctrl + F5 gebruikt). U moet ook controleren of het project dat u wilt uitvoeren, is ingesteld als het opstartproject. U kunt dit doen door met de rechtermuisknop op de naam van het project te klikken in Solution Explorer en vervolgens links te klikken Instellen als opstartproject in het contextmenu dat verschijnt.


C ++ 11

In 2011 werd een nieuwe hoofdversie van de C ++ -taalstandaard goedgekeurd door de ISO / IEC-werkgroep die verantwoordelijk is voor het ontwerp en de ontwikkeling van C ++ als taal. In vergelijking met C ++ 98 en C ++ 03 voelt C ++ 11 aan als een andere taal. Omdat C ++ 11 zo nieuw is, zijn er geen compilers die elke functie ondersteunen, en er zijn er die minder ondersteunen dan andere. Ik heb Visual C ++ getarget en de functies die het implementeert in de meest recente versie (Visual Studio 2012 RC ten tijde van dit schrijven), hoewel ik een aantal functies heb genoemd die Visual C ++ momenteel niet ondersteunt en waar nodig heb gewezen.

Het is onwaarschijnlijk dat Visual C ++ veel zal veranderen tussen Visual Studio 2012 RC en Visual Studio 2012 RTM. Er zijn plannen om een ​​out-of-band update uit te voeren, die extra C ++ 11 taalondersteuning zal toevoegen, ergens nadat de RTM is uitgebracht. Omdat ik niet kan voorspellen welke functies worden toegevoegd en er geen voorkennis over hebben, heb ik meestal geen dingen behandeld die niet worden ondersteund in de RC.

Als je al ervaring hebt met C ++ van vijf jaar geleden, of misschien langer, ben je waarschijnlijk zeer aangenaam verrast - wat niet wil zeggen dat het alles heeft wat C # heeft.

Er zijn functies van C # en .NET die ik mis bij het werken in C ++. Maar er zijn ook functies van C ++ die ik mis bij het werken in C #. Ik mis de eenvoud van het casten in C # dat het type systeem van de CLR biedt wanneer ik in C ++ werk. Ik mis ook de vollediger reeks uitzonderingen van .NET en de vaak betere IntelliSense die .NET biedt. In C ++ merk ik dat ik veel meer naar documentatie verwijs dan in C # om dingen uit te vinden zoals welke argumentwaarden ik kan en moet doorgeven aan een bepaalde functie, en welke waarden er van te verwachten zijn.

Wanneer ik in C # werk, merk ik dat ik de breedte mis die de verschillende opslagduren van C ++ bieden. In C # komen de meeste dingen gewoon op de GC-beheerde heap terecht, wat het geheugenbeheer aanzienlijk vereenvoudigt. Maar soms wil ik niet per se dat een klasse-instantie zich op de heap bevindt. In C # heb ik geen andere keus dan de klas als een structuur te herschrijven; terwijl ik in C ++, kan ik gemakkelijk tussen de twee kiezen zonder de klassendefinitie zelf te hoeven veranderen. Ik mis ook stand-alone functies (hoewel ze meestal kunnen worden geëmuleerd met statische methoden in statische klassen in C #). Ik vind het ook leuk dat mijn C ++ -programma's als zwaar geoptimaliseerde (en dus moeilijk te begrijpen) machinecode eindigen wanneer ik ze compileer, dus ik hoef me niet echt zorgen te maken dat ik mijn programma's onduidelijk maak als ik wil dat mijn code geheim blijft ( zoals ik doe met .NET, hoewel er een aantal zeer goede obfuscation-tools zijn).

Conclusie

Elke taal richt zijn eigen set van problemen en heeft zijn eigen geschiedenis en eigenaardigheden die ermee samenhangen. Hopelijk vindt u C ++ een interessante en nuttige taal om toe te voegen aan uw programmeerrepertoire.

Deze les staat voor een hoofdstuk uit C ++ Kort gezegd, een gratis eBoek van het team van Syncfusion.