Introduktion til C ++ klasser og objekter

01

af 09

Start af C ++ klasser

Hænder, der skriver på bærbar computer
Sam Edwards / Getty Images

objekter er den største forskel mellem C ++ og C. Et af de tidligste navne for C ++ var C med klasser.

Klasser og genstande

En klasse er en definition af et objekt. Det er en type ligesom int. En klasse ligner a struct med kun en forskel: alle strukt-medlemmer er som standard offentlige. Alle klasser medlemmer er private.

Husk - en klasse er en type, og et objekt med denne klasse er bare en variabel.

Før vi kan bruge et objekt, skal den oprettes. Den enkleste definition af en klasse er:

 klasse navn {

 // medlemmer

 }


Dette eksempelklasse nedenfor modellerer en simpel bog. Ved hjælp af OOP kan du abstrahere problemet og tænke over det og ikke kun vilkårlige variabler.

 // eksempel en

 #omfatte 

 #omfatte 


 klasse Bog

 {

 int PAGECOUNT;

 int CurrentPage; 

 offentlig:

 Book (int Numpages); // Konstruktør

 ~ Book () {}; // Destructor

 annullere SetPage (int PageNumber);

 int GetCurrentPage (tom);

 }; 


 Bog:: Bog (int NumPages) {

 PageCount = NumPages;

 }


 void Book:: SetPage (int PageNumber) {
instagram viewer

 CurrentPage = PAGENUMBER;

 }


 int Book:: GetCurrentPage (tom) {

 retur CurrentPage;

 }


 int main () {

 Book ABook (128);

 En bog. SetPage (56);

 std:: cout << "Aktuel side" << OK. GetCurrentPage () << std:: endl;

 retur 0;

 }


Alle koder fra klassebog ned til int Book:: GetCurrentPage (tom) { funktion er en del af klassen. Det main () funktion er der for at gøre dette til et kørbart program.

02

af 09

Forståelse af bogklassen

I main () funktion oprettes en variabel BOG af typen Bog oprettes med værdien 128. Så snart udførelse når dette punkt, er det objekt ABook konstrueret. På næste linje metoden En bog. SetPage () kaldes og værdien 56 tildelt objektvariablen En bog. Nuværende side. Derefter cout udsender denne værdi ved at kalde En bog. GetCurrentPage () metode.

Når henrettelsen når retur 0; ABook-objektet er ikke længere nødvendigt af applikationen. Compileren genererer et opkald til destruktoren.

Erklærende klasser

Alt imellem Klassebog og } er klassedeklarationen. Denne klasse har to private medlemmer, både af typen int. Disse er private, fordi standardadgangen til klassemedlemmer er privat.

Det offentlig: direktivet fortæller compiler der adgang herfra er offentligt. Uden dette, ville det stadig være privat og forhindre de tre linjer i main () funktion i at få adgang abook medlemmer. Prøv at kommentere offentlig: linje ud og rekompilering for at se de efterfølgende kompileringsfejl.

Denne linje nedenfor erklærer en konstruktør. Dette er den funktion, der kaldes, når objektet først oprettes.

 Book (int Numpages); // Konstruktør 

Det kaldes fra linjen

 Book ABook (128); 

Dette opretter et objekt kaldet ABook af typen Book og kalder funktionen Book () med parameter 128.

03

af 09

Mere om bogklassen

I C ++ har konstruktøren altid det samme navn som klassen. Konstruktøren kaldes, når objektet oprettes, og hvor du skal placere din kode for at initialisere objektet.

I bog Den næste linje efter konstruktøren destruktøren. Dette har samme navn som konstruktøren, men med en ~ (tilde) foran sig. Under ødelæggelsen af ​​et objekt kaldes destruktoren til at rydde op i objektet og sikre, at ressourcer som hukommelse og filhåndtering, der bruges af objektet, frigives.

Husk—En klasse xyz har en konstruktorfunktion xyz () og destruktorfunktion ~ xyz (). Selv hvis du ikke erklærer det, tilføjer compileren dem lydløst.

Destruktoren kaldes altid, når objektet afsluttes. I dette eksempel ødelægges objektet implicit, når det går uden for rækkevidde. For at se denne, ændre destructoren erklæring til dette:

 ~ Bog () {std:: cout << "Destructor kaldet";}; // Destructor 

Dette er en inline funktion med kode i erklæringen. En anden måde at inline tilføjer ordet inline

 inline ~ Bog (); // Destructor


og tilføj destruktoren som en funktion som denne.

 inline Book:: ~ Book (void) { 

 std:: cout << "Destruktor kaldet";

 }


Inline-funktioner er tip til kompilatoren for at generere en mere effektiv kode. De bør kun bruges til små funktioner, men hvis de anvendes i passende steder-såsom inde loops—Kan gøre en betydelig forskel i ydeevne.

04

af 09

Skrivning af klassemetoder

Bedste praksis for objekter er at gøre alle data private og få adgang til dem gennem funktioner kendt som accessor-funktioner. SetPage () og GetCurrentPage () er de to funktioner, der bruges til at få adgang til objektvariablen Nuværende side.

Skift klasse erklæring om at strukturere og rekompilere. Det skal stadig samles og køre korrekt. Nu de to variabler pAGECOUNT og Nuværende side er offentligt tilgængelige. Tilføj denne linje efter Book ABook (128), så vil den samles.

 En bog. PAGECOUNT = 9;


Hvis du skifter struktur tilbage til klasse og rekompilering, vil denne nye linje ikke længere kompilere som pAGECOUNT er nu privat igen.

The:: Notation

Efter kroppen af ​​Bog klasse erklæring, der er de fire definitioner af medlem funktioner. Hver er defineret med den bog:: præfiks for at identificere den som tilhørende denne klasse.:: kaldes omfanget id. Den identificerer funktionen som en del af klassen. Dette er indlysende i klassen erklæring, men ikke udenfor.

Hvis du har erklæret en medlemsfunktion i en klasse, skal du angive organets funktion på denne måde. Hvis du ønsker, at klassen Bog skulle bruges af andre filer, kan du muligvis flytte erklæringen om bog til en separat header fil, måske kaldet book.h. Enhver anden fil kunne derefter indeholde den med

 #include "book.h" 

05

af 09

Arv og polymorfisme

Dette eksempel viser arv. Dette er en to klasse ansøgning med én klasse afledt af et andet.

 #omfatte 

 #omfatte 


 klasse Point

 {


 int x, y;

 offentlig:

 Punkt (int atx, int aty); // Konstruktør

 inline virtuelt ~ Punkt (); // Destructor

 virtuelt tomrum Draw ();

 }; 


 klasse Circle: public Point {


 int radius;

 offentlig:

 Cirkel (int atx, int aty, int the radius);

 inline virtuel ~ cirkel ();

 virtuelt tomrum Draw ();

 };



 Punkt:: Punkt (int atx, int aty) {

 x = ATX;

 y = ATY;

 }


 inline Point:: ~ Point (void) { 

 std:: cout << "Point Destructor kaldet";

 }


 void Point:: Draw (void) {

 std:: cout << "Punkt:: Tegn punkt ved" << x << "" << y << std:: endl;

 }



 Cirkel:: Circle (int ATX, int ATY, int theRadius): Punkt (ATX, ATY) {

 radius = theRadius;

 }


 inline Circle:: ~ Circle () {

 std:: cout << "Circle Destructor kaldet" << std:: endl;

 }


 ugyldig Circle:: Draw (void) {

 Punkt:: Tegn ();

 std:: cout << "cirkel:: Tegn punkt" << "Radius" << radius << std:: endl;

 }


 int main () {

 Cirkel ACircle (10,10,5);

 En cirkel. Tegn ();

 retur 0;

 }


Eksemplet har to klasser, punkt og cirkel, der modellerer et punkt og en cirkel. A Point har x- og y-koordinater. Circle-klassen er afledt af Point-klassen og tilføjer en radius. Begge klasser inkluderer a Tegne() medlemsfunktion. For at holde dette eksempel kort er output kun tekst.

06

af 09

Arv

Klassen Cirkel er afledt af Punkt klasse. Dette gøres på denne linje:

 klasse Cirkel: Punkt {


Fordi det stammer fra en baseklasse (Point), arver Circle alle klassemedlemmer.

 Punkt (int atx, int aty); // Konstruktør

 inline virtuelt ~ Punkt (); // Destructor

 virtuelt tomrum Draw ();


 Cirkel (int atx, int aty, int the radius);

 inline virtuel ~ cirkel ();

 virtuelt tomrum Draw ();


Tænk på Circle-klassen som Point-klassen med et ekstra medlem (radius). Det arver basisklasse-medlemsfunktioner og private variabler x og y.

Det kan ikke tildele eller bruge disse undtagen implicit, fordi de er private, så det har at gøre det gennem Circle konstruktør s klargøringsliste. Dette er noget, du skal acceptere, som det er for nu. Jeg kommer tilbage til initialiseringslister i en fremtidig tutorial.

I Circle Constructor, før theRadius er tildelt til radius, Point del af Circle er opbygget gennem et kald til Point konstruktør på klargøringsliste. Denne liste er alt mellem: og {nedenfor.

 Cirkel:: Circle (int ATX, int ATY, int theRadius): Punkt (ATX, ATY) 


I øvrigt kan initialisering af konstruktortypen bruges til alle indbyggede typer.

 int a1 (10);

 int a2 = 10;


Begge gør det samme.

07

af 09

Hvad er Polymorfi?

Polymorfisme er et generisk udtryk, der betyder "mange former". I C ++ er den mest enkle form for polymorfisme overbelastning af funktioner. For eksempel kaldes flere funktioner SortArray (arraytype) hvor sortarray muligvis er en matrix af ints eller double.

Vi er dog kun interesseret i OOP-formen for polymorfisme her. Dette gøres ved at lave en funktion (f.eks. Draw ()) virtuel i basisklassen punkt og derefter tvingende det i afledt klasse Cirkel.

Selvom funktionen Tegne() er virtuel i den afledte klasse Cirkel, dette er faktisk ikke nødvendigt - det er bare en påmindelse for mig om, at dette er virtuelt. Hvis funktionen i en afledt klasse svarer til en virtuel funktion i baseklassen på navn og parametertyper, er den automatisk virtuel.

Tegning af et punkt og tegning af en cirkel er to meget forskellige operationer med kun koordinaterne for punktet og cirklen til fælles, så det er vigtigt, at det korrekte Tegne() Hedder. Hvordan kompilatoren formår at generere kode, der får den rigtige virtuelle funktion, vil blive dækket i en fremtidig tutorial.

08

af 09

C ++ Constructors

Constructors

En konstruktør er en funktion, der initialiserer medlemmerne af et objekt. En konstruktør ved kun, hvordan man bygger et objekt i sin egen klasse.

Konstruktører arves ikke automatisk mellem basis- og afledte klasser. Hvis du ikke leverer en i den afledte klasse, leveres der en standard, men dette gør muligvis ikke, hvad du vil.

Hvis der ikke leveres nogen konstruktør, oprettes en standard af kompilatoren uden parametre. Der skal altid være en konstruktør, selvom den er standard og tom. Hvis du leverer en konstruktør med parametre derefter en standard vil IKKE blive oprettet.

Nogle punkter om konstruktører:

  • Constructors er blot funktioner med samme navn som klassen.
  • Constructors er beregnet til at initialisere medlemmerne af klassen, når en instans af denne klasse er oprettet.
  • Konstruktører kaldes ikke direkte (undtagen gennem initialiseringslister)
  • Konstruktører er aldrig virtuelle.
  • Flere konstruktører til samme klasse kan defineres. De skal have forskellige parametre til at skelne dem.

Der er meget mere at lære om konstruktører, f.eks. Standardkonstruktører, tildelings- og kopikonstruktører. Disse diskuteres i den næste lektion.

09

af 09

Oprydning af C ++ Destruktorer

En destructor er en klassemedlemfunktion, der har samme navn som konstruktøren (og klassen), men med en ~ (tilde) foran.

 ~ Cirkel ();


Når en genstand går ud af omfang eller mere sjældent eksplicit ødelagt, er dens destructor kaldes. For eksempel, hvis objektet har dynamiske variabler såsom pegere, skal disse frigøres, og destruktoren er det passende sted.

I modsætning til konstruktører kan og bør destruktører gøres virtuel, hvis du har afledte klasser. I Punkt og Cirkel klasseeksempel er destruktoren ikke nødvendig, da der ikke er noget oprydningsarbejde, der skal udføres (det fungerer bare som et eksempel). Havde der været dynamiske medlemsvariabler (som pointers) så ville disse have krævet frigørelse for at forhindre hukommelseslækager.

Når den afledte klasse tilføjer medlemmer, der kræver oprydning, er der brug for virtuelle destruktører. Når den virtuelle kaldes den mest afledte klassedestruktor først, kaldes dennes nærmeste forfæders destruktor osv. Op til baseklassen.

I vores eksempel

 ~ Cirkel ();

derefter

 ~ Punkt ();


Den basisklasser destructor kaldes sidst.

Dette afslutter denne lektion. I den næste lektion lærer du om standardkonstruktører, kopikonstruktører og tildeling.

instagram story viewer