Introduktion till C ++ klasser och objekt

01

av 09

Starta C ++ klasser

Händer som skriver på bärbar dator
Sam Edwards / Getty Images

Objekt är den största skillnaden mellan C ++ och C. Ett av de tidigaste namnen för C ++ var C med klasser.

Klasser och objekt

En klass är en definition av ett objekt. Det är en typ precis som int. En klass liknar a struct med bara en skillnad: alla strukt-medlemmar är offentliga som standard. Alla klasser medlemmar är privata.

Kom ihåg - en klass är en typ och ett objekt i denna klass är bara en variabel.

Innan vi kan använda ett objekt måste det skapas. Den enklaste definitionen av en klass är:

 klassnamn {

 // medlemmar

 }


I det här exemplet nedan modelleras en enkel bok. Med hjälp av OOP kan du abstrahera problemet och tänka på det och inte bara godtyckliga variabler.

 // exempel ett

 #inkludera 

 #inkludera 


 klassbok

 {

 int PageCount;

 int CurrentPage; 

 offentlig:

 Bok (int Numpages); // Konstruktör

 ~ Bok () {}; // Destructor

 ogiltig SetPage (int PageNumber);

 int GetCurrentPage (ogiltig);

 }; 


 Bok:: Bok (int NumPages) {

 PageCount = NumPages;

 }
instagram viewer


 void Book:: SetPage (int PageNumber) {

 CurrentPage = Number;

 }


 int Book:: GetCurrentPage (void) {

 returnera CurrentPage;

 }


 int main () {

 Book ABook (128);

 En bok. SetPage (56);

 std:: cout << "Aktuell sida" << OK. GetCurrentPage () << std:: endl;

 retur 0;

 }


All kod från klassbok ner till int Book:: GetCurrentPage (void) { funktionen är en del av klassen. De main () funktionen är där för att göra detta till en körbar applikation.

02

av 09

Förstå bokklassen

I main () funktion skapas en variabel med boken av typen Book med värdet 128. Så snart exekveringen når denna punkt konstrueras objektet ABook. På nästa rad metoden En bok. SetPage () kallas och värdet 56 tilldelas objektvariabeln En bok. Nuvarande sida. Sedan cout matar ut detta värde genom att ringa En bok. GetCurrentPage () metod.

När körningen når retur 0; ABook-objektet behövs inte längre av applikationen. Kompilatorn genererar ett samtal till förstöraren.

Förklarande klasser

Allt mellan Klassbok och den } är klassdeklarationen. Denna klass har två privata medlemmar, båda av typ int. Dessa är privata eftersom standardåtkomst till klassmedlemmar är privat.

De offentlig: direktivet berättar för kompilator att åtkomst härifrån är offentlig. Utan detta skulle det fortfarande vara privat och förhindra att de tre linjerna i huvudfunktionen () får åtkomst till Abook-medlemmar. Prova att kommentera offentlig: radera ut och kompilera igen för att se efterföljande sammanställningsfel.

Denna rad nedan förklarar en konstruktör. Detta är den funktion som kallas när objektet först skapas.

 Bok (int Numpages); // Konstruktör 

Det kallas från linjen

 Book ABook (128); 

Detta skapar ett objekt som heter ABook av typen Book och kallar funktionen Book () med parameter 128.

03

av 09

Mer om bokklassen

I C ++ har konstruktören alltid samma namn som klassen. Konstruktören kallas när objektet skapas och där du ska placera din kod för att initialisera objektet.

I bok Nästa rad efter konstruktören förstöraren. Detta har samma namn som konstruktören men med en ~ (tilde) framför sig. Under förstörelsen av ett objekt kallas förstöraren att rensa upp objektet och se till att resurser som minne och filhandtag som används av objektet släpps.

Kom ihåg—En klass xyz har en konstruktionsfunktion xyz () och destruktorfunktion ~ xyz (). Även om du inte förklarar, lägger kompilatorn tyst till dem.

Förstöraren kallas alltid när objektet avslutas. I detta exempel förstörs objektet implicit när det går utanför räckvidden. För att se detta, ändra destruktordeklarationen till detta:

 ~ Bok () {std:: cout << "Destructor called";}; // Destructor 

Detta är en inline-funktion med kod i deklarationen. Ett annat sätt att inline är att lägga till ordet inline

 inline ~ Bok (); // Destructor


och lägg till förstöraren som en funktion som denna.

 inline Book:: ~ Book (void) { 

 std:: cout << "Destructor called";

 }


Inlinefunktioner är antydningar till kompilatorn för att generera mer effektiv kod. De bör endast användas för små funktioner, men om de används på lämpliga platser - till exempel inne slingor—Kan göra en betydande skillnad i prestanda.

04

av 09

Skriva klassmetoder

Bästa praxis för objekt är att göra all data privat och få tillgång till den genom funktioner som kallas accessor-funktioner. SetPage () och GetCurrentPage () är de två funktionerna som används för att komma åt objektvariabeln Nuvarande sida.

Ändra klass förklaring att strukturera och kompilera igen. Den bör fortfarande kompilera och köra korrekt. Nu de två variablerna Sidonummer och Nuvarande sida är offentligt tillgängliga. Lägg till den här raden efter Book ABook (128), så kommer den att sammanställas.

 En bok. PageCount = 9;


Om du byter struktur tillbaka till klass och kompilera, kommer den nya raden inte längre att kompilera som Sidonummer är nu privat igen.

The:: Notation

Efter bokklassklassdeklarationen finns det de fyra definitionerna av medlemsfunktionerna. Var och en definieras med boken:: prefix för att identifiera det som tillhör den klassen.:: kallas omfattningsidentifieraren. Den identifierar funktionen som en del av klassen. Detta är uppenbart i klassdeklarationen men inte utanför den.

Om du har förklarat en medlemsfunktion i en klass måste du ange funktionen på detta sätt. Om du vill att bokklassen ska användas av andra filer kan du flytta bokförklaringen till en separat rubrik fil, kanske kallat book.h. Alla andra filer kan då inkludera den med

 # inkludera "bok.h" 

05

av 09

Arv och polymorfism

Detta exempel visar arv. Detta är en tvåklassig applikation med en klass härrörande från en annan.

 #inkludera 

 #inkludera 


 klass Point

 {


 int x, y;

 offentlig:

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

 inline virtual ~ Point (); // Destructor

 virtual void Draw ();

 }; 


 klass Circle: public Point {


 int radie;

 offentlig:

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

 inline virtual ~ Circle ();

 virtual void Draw ();

 };



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

 x = atx;

 y = aty;

 }


 inline Point:: ~ Point (void) { 

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

 }


 void Point:: Draw (void) {

 std:: cout << "Point:: Draw point vid" << x << "" << y << std:: endl;

 }



 Circle:: Circle (int atx, int aty, int theRadius): Point (atx, aty) {

 radie = theRadius;

 }


 inline Circle:: ~ Circle () {

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

 }


 void Circle:: Draw (void) {

 Punkt:: Rita ();

 std:: cout << "cirkel:: Rita punkt" << "Radius" << radie << std:: endl;

 }


 int main () {

 Cirkel ACircle (10,10,5);

 En cirkel. Rita ();

 retur 0;

 }


Exemplet har två klasser, punkt och cirkel, som modellerar en punkt och en cirkel. En punkt har x- och y-koordinater. Cirkelklassen härrör från punktklassen och lägger till en radie. Båda klasserna inkluderar a Dra() medlemsfunktion. För att hålla detta exempel kort är utgången bara text.

06

av 09

Arv

Klassen Cirkel är härledd från Punkt klass. Detta görs på den här raden:

 klass Circle: Point {


Eftersom det härstammar från en basklass (Point) ärver cirkeln alla klassmedlemmar.

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

 inline virtual ~ Point (); // Destructor

 virtual void Draw ();


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

 inline virtual ~ Circle ();

 virtual void Draw ();


Tänk på cirkelklassen som punktklassen med en extra medlem (radie). Det ärver basfunktionens medlemsfunktioner och privata variabler x och y.

Den kan inte tilldela eller använda dessa utom implicit eftersom de är privata, så det måste göra det via Circle-konstruktörens Initialiseringslista. Det här är något du borde acceptera som nu. Jag kommer tillbaka till initialiseringslistorna i en framtida handledning.

I Circle Constructor, före theRadius tilldelas till radie, Point-delen av Circle konstrueras genom ett samtal till Point's konstruktör i initialiseringslistan. Denna lista är allt mellan: och {nedan.

 Circle:: Circle (int atx, int aty, int theRadius): Point (atx, aty) 


För övrigt kan initialisering av konstruktortyp användas för alla inbyggda typer.

 int a1 (10);

 int a2 = 10;


Båda gör samma sak.

07

av 09

Vad är polymorfism?

Polymorfism är en generisk term som betyder "många former". I C ++ är den enklaste formen av polymorfism överbelastning av funktioner. Till exempel flera funktioner som heter SortArray (array) där sortarray kan vara en array av ints eller dubbel.

Vi är dock bara intresserade av OOP-formen av polymorfism här. Detta görs genom att göra en funktion (t.ex. Draw ()) virtuell i basklassen Peka och sedan åsidosätta den i härledd klass Cirkel.

Även om funktionen Dra() är virtuellt i den härledda klassen Cirkel, detta behövs faktiskt inte - det är bara en påminnelse för mig att det är virtuellt. Om funktionen i en härledd klass matchar en virtuell funktion i basklassen för namn- och parametertyper är den automatiskt virtuell.

Att rita en punkt och rita en cirkel är två mycket olika operationer med bara koordinaterna för punkten och cirkeln gemensamt, så det är viktigt att rätt Dra() kallas. Hur kompilatorn lyckas generera kod som får rätt virtuell funktion kommer att behandlas i en framtida handledning.

08

av 09

C ++ konstruktörer

konstruktörer

En konstruktör är en funktion som initialiserar medlemmarna i ett objekt. En konstruktör vet bara hur man bygger ett objekt i sin egen klass.

Konstruktörer ärvs inte automatiskt mellan bas- och härledda klasser. Om du inte levererar en i den härledda klassen tillhandahålls ett standardvärde men det kanske inte gör vad du vill.

Om ingen konstruktör tillhandahålls skapas en standardinställning av kompilatorn utan några parametrar. Det måste alltid finnas en konstruktör, även om den är standard och tom. Om du levererar en konstruktör med parametrar skapas INTE ett standard.

Några poäng om konstruktörer:

  • Konstruktörer är bara funktioner med samma namn som klassen.
  • Konstruktörer är avsedda att initialisera medlemmarna i klassen när en instans av den klassen skapas.
  • Konstruktörer kallas inte direkt (förutom genom initialiseringslistor)
  • Konstruktörer är aldrig virtuella.
  • Flera konstruktörer för samma klass kan definieras. De måste ha olika parametrar för att skilja dem.

Det finns mycket mer att lära sig om konstruktörer, till exempel standardkonstruktörer, tilldelnings- och kopieringskonstruktörer. Dessa kommer att diskuteras i nästa lektion.

09

av 09

Att rensa upp C ++ Destruktorer

En förstörare är en klassmedlemfunktion som har samma namn som konstruktören (och klassen) men med en ~ (tilde) framför.

 ~ Cirkel ();


När ett objekt går utanför räckvidden eller mer sällan uttryckligen förstörs, kallas dess förstörare. Till exempel, om objektet har dynamiska variabler som pekare, måste de frigöras och förstöraren är rätt plats.

Till skillnad från konstruktörer kan och bör destruktörer göras virtuella om du har härledda klasser. I Punkt och Cirkel klasser exempel, destruktorn behövs inte eftersom det inte finns något saneringsarbete att göra (det fungerar bara som ett exempel). Hade det funnits dynamiska medlemsvariabler (som pekare) då skulle de ha krävt frigöring för att förhindra minnesläckage.

När den härledda klassen lägger till medlemmar som kräver städning behövs virtuella förstörare. När virtuell kallas den mest härledda klassdestruktorn först, sedan kallas dess omedelbara förfäders förstörare, och så vidare upp till basklassen.

I vårt exempel,

 ~ Cirkel ();

sedan

 ~ Punkt ();


Basklassen förstörare kallas sist.

Detta slutför lektionen. I nästa lektion kan du lära dig om standardkonstruktörer, kopiera konstruktörer och uppdrag.

instagram story viewer