Introduksjon til C ++ klasser og objekter

click fraud protection

01

av 09

Starter C ++ klasser

Hender som skriver på laptop
Sam Edwards / Getty Images

objekter er den største forskjellen mellom C ++ og C. Et av de tidligste navnene for C ++ var C with Classes.

Klasser og objekter

En klasse er en definisjon av et objekt. Det er en type akkurat som int. En klasse ligner a struct med bare en forskjell: alle struktmedlemmer er offentlige som standard. Alle klassemedlemmer er private.

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

Før vi kan bruke et objekt, må det opprettes. Den enkleste definisjonen av en klasse er:

 klassenavn {

 // medlemmer

 }


Denne eksemplet klassen nedenfor modellerer en enkel bok. Ved å bruke OOP kan du abstrahere problemet og tenke på det og ikke bare vilkårlige variabler.

 // eksempel en

 #inkludere 

 #inkludere 


 klasse Bok

 {

 int PageCount;

 int CurrentPage; 

 offentlig:

 Book (int Numpages); // Konstruktør

 ~ Book () {}; // Destructor

 ugyldig SetPage (int PageNumber);

 int GetCurrentPage (tom);

 }; 


 Book:: Book (int NumPages) {

 PageCount = NumPages;
instagram viewer

 }


 void Book:: SetPage (int PageNumber) {

 CurrentPage = undersider;

 }


 int Book:: GetCurrentPage (void) {

 retur CurrentPage;

 }


 int main () {

 Book ABook (128);

 Ei bok. SetPage (56);

 std:: cout << "Nåværende side" << Se på. GetCurrentPage () << std:: endl;

 retur 0;

 }


All koden fra klassebok ned til int Book:: GetCurrentPage (void) { funksjon er en del av klassen. De hoved() funksjonen er der for å gjøre dette til et kjørbart program.

02

av 09

Forståelse av bokklassen

I hoved() funksjonen opprettes en variabel I bok av typen Book med verdien 128. Så snart utførelsen når dette punktet, blir objektet ABook konstruert. På neste linje metoden Ei bok. SetPage () kalles og verdien 56 tilordnet objektvariabelen Ei bok. Nåværende side. Deretter domstol gir denne verdien ved å ringe til Ei bok. GetCurrentPage () metode.

Når henrettelsen når retur 0; ABook-objektet er ikke lenger nødvendig av applikasjonen. Kompilatoren genererer et anrop til ødeleggeren.

Deklarerende klasser

Alt mellom Klassebok og } er klassedeklarasjonen. Denne klassen har to private medlemmer, begge av typen int. Disse er private fordi standardtilgangen til klassemedlemmer er privat.

De offentlig: direktivet forteller kompilatoren at tilgangene herfra er offentlige. Uten dette ville det fortsatt være privat og forhindre at de tre linjene i hovedfunksjonen () får tilgang til Abook-medlemmene. Prøv å kommentere offentlig: linje ut og kompilere for å se påfølgende kompilasjonsfeil.

Denne linjen nedenfor erklærer en konstruktør. Dette er funksjonen som kalles når objektet opprettes første gang.

 Book (int Numpages); // Konstruktør 

Det heter fra linjen

 Book ABook (128); 

Dette oppretter et objekt kalt ABook av typen Book og kaller Book () -funksjonen med parameter 128.

03

av 09

Mer om bokklassen

I C ++ har konstruktøren alltid samme navn som klassen. Konstruktøren kalles når objektet opprettes, og det er der du bør sette koden for å initialisere objektet.

I bok Den neste linjen etter konstruktøren ødeleggeren. Dette har samme navn som konstruktøren, men med en ~ (tilde) foran seg. Under ødeleggelsen av et objekt kalles destruktoren for å rydde opp gjenstanden og sikre at ressurser som minne og filhåndtak brukt av objektet blir frigitt.

Huske—En klasse xyz har en konstruksjonsfunksjon xyz () og destruktorfunksjon ~ xyz (). Selv om du ikke erklærer det, vil kompilatoren stille dem stille.

Destruktoren blir alltid kalt når gjenstanden avsluttes. I dette eksemplet blir objektet implisitt ødelagt når det går utenfor omfanget. For å se dette, endre destruktordeklarasjonen til denne:

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

Dette er en inline-funksjon med kode i erklæringen. En annen måte å inline på er å legge til ordet inline

 inline ~ Bok (); // Destructor


og legge til destruktoren som en funksjon som denne.

 inline Book:: ~ Book (void) { 

 std:: cout << "Destructor called";

 }


Innvendige funksjoner er hint til kompilatoren for å generere mer effektiv kode. De skal bare brukes til små funksjoner, men hvis de brukes på passende steder - for eksempel inne løkker—Kan utgjøre en betydelig forskjell i ytelse.

04

av 09

Skrive klassemetoder

Beste praksis for objekter er å gjøre all data privat og få tilgang til den gjennom funksjoner kjent som accessor-funksjoner. SetPage () og GetCurrentPage () er de to funksjonene som brukes for å få tilgang til objektvariabelen Nåværende side.

Endre klasse erklæring om å strukturere og omkompilere. Den skal fortsatt samles og kjøres riktig. Nå er de to variablene PAGECOUNT og Nåværende side er offentlig tilgjengelige. Legg til denne linjen etter Book ABook (128), så vil den samles.

 Ei bok. PageCount = 9;


Hvis du bytter struktur tilbake til klasse og kompilere, den nye linjen vil ikke lenger samles som PAGECOUNT er nå privat igjen.

:: Notasjonen

Etter bokklasseklarasjonen er det de fire definisjonene av medlemsfunksjonene. Hver er definert med boken:: prefiks for å identifisere den som tilhører den klassen.:: kalles omfangsidentifikatoren. Den identifiserer funksjonen som en del av klassen. Dette er åpenbart i klassedeklarasjonen, men ikke utenfor den.

Hvis du har erklært en medlemsfunksjon i en klasse, må du oppgi organets funksjon på denne måten. Hvis du ville at bokklassen skal brukes av andre filer, kan du flytte bokdeklarasjonen til en egen Overskrift fil, kanskje kalt book.h. Enhver annen fil kan da inkludere den med

 # inkluder "bok.h" 

05

av 09

Arv og polymorfisme

Dette eksemplet vil demonstrere arv. Dette er en to-klassers applikasjon med en klasse avledet fra en annen.

 #inkludere 

 #inkludere 


 klasse Point

 {


 int x, y;

 offentlig:

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

 inline virtual ~ Point (); // Destructor

 virtual void Draw ();

 }; 


 class Circle: public Point {


 int radius;

 offentlig:

 Circle (int atx, int aty, int theRadius);

 inline virtual ~ Circle ();

 virtual void Draw ();

 };



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

 x = atx;

 y = aty;

 }


 inline Point:: ~ Point (ugyldig) { 

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

 }


 void Point:: Draw (void) {

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

 }



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

 radius = theRadius;

 }


 inline Circle:: ~ Circle () {

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

 }


 void Circle:: Draw (void) {

 Punkt:: Tegn ();

 std:: cout << "sirkel:: Tegnpunkt" << "Radius" << radius << std:: endl;

 }


 int main () {

 Circle ACircle (10,10,5);

 En sirkel. Tegn ();

 retur 0;

 }


Eksemplet har to klasser, punkt og sirkel, og modellerer et punkt og en sirkel. Et punkt har x- og y-koordinater. Circle-klassen er avledet fra Point-klassen og legger til en radius. Begge klasser inkluderer a Tegne() medlemsfunksjon. For å holde dette eksemplet kort er utdata bare tekst.

06

av 09

Arv

Klassen Sirkel er avledet fra Punkt klasse. Dette gjøres på denne linjen:

 class Circle: Point {


Fordi det er avledet fra en baseklasse (Point), arver Circle alle klassemedlemmene.

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

 inline virtual ~ Point (); // Destructor

 virtual void Draw ();


 Circle (int atx, int aty, int theRadius);

 inline virtual ~ Circle ();

 virtual void Draw ();


Tenk på Circle-klassen som Point-klassen med et ekstra medlem (radius). Det arver grunnklasse-medlemsfunksjoner og private variabler x og y.

Den kan ikke tilordne eller bruke disse unntatt implisitt fordi de er private, så det må gjøre det gjennom Circle-konstruktørens initialiseringsliste. Dette er noe du bør godta som det er for nå. Jeg kommer tilbake til initialiseringslistene i en fremtidig veiledning.

I Circle Constructor, før theRadius er tildelt radius, er Point-delen av Circle konstruert gjennom en oppfordring til Point's konstruktør i initialiseringslisten. Denne listen er alt mellom: og {nedenfor.

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


Forresten, initialisering av konstruktortypen kan brukes til alle innebygde typer.

 int a1 (10);

 int a2 = 10;


Begge gjør det samme.

07

av 09

Hva er polymorfisme?

Polymorfisme er et generisk begrep som betyr "mange former". I C ++ er den enkleste formen for polymorfisme overbelastning av funksjoner. For eksempel kalt flere funksjoner SortArray (array) hvor sortarray kan være en matrise av ints eller dobles.

Vi er imidlertid bare interessert i OOP-formen for polymorfisme. Dette gjøres ved å lage en funksjon (f.eks. Draw ()) virtuell i baseklassen Point og deretter overstyre det i avledet klasse Sirkel.

Selv om funksjonen Tegne() er virtuell i den avledede klassen Sirkel, dette er faktisk ikke nødvendig - det er bare en påminnelse for meg om at dette er virtuelt. Hvis funksjonen i en avledet klasse samsvarer med en virtuell funksjon i baseklassen på navn og parametertyper, er den automatisk virtuell.

Å tegne et punkt og tegne en sirkel er to veldig forskjellige operasjoner med bare koordinatene til punktet og sirkelen til felles, så det er viktig at riktig Tegne() er kalt. Hvordan kompilatoren klarer å generere kode som får riktig virtuell funksjon, vil bli dekket i en fremtidig veiledning.

08

av 09

C ++ konstruktører

Constructors

En konstruktør er en funksjon som initialiserer medlemmene av et objekt. En konstruktør vet bare hvordan man bygger et objekt av sin egen klasse.

Konstruktører arves ikke automatisk mellom basis- og avledede klasser. Hvis du ikke leverer en i den avledede klassen, vil en standard bli gitt, men dette kan ikke gjøre det du vil.

Hvis ingen konstruktør leveres, opprettes en standard av kompilatoren uten noen parametere. Det må alltid være en konstruktør, selv om den er standard og tom. Hvis du leverer en konstruktør med parametere, opprettes IKKE en standard.

Noen punkter om konstruktører:

  • Konstruktører er bare funksjoner med samme navn som klassen.
  • Konstruktører er ment å initialisere medlemmene i klassen når en instans av den klassen opprettes.
  • Konstruktører kalles ikke direkte (unntatt gjennom initialiseringslister)
  • Konstruktører er aldri virtuelle.
  • Flere konstruktører for samme klasse kan defineres. De må ha forskjellige parametere for å skille dem.

Det er mye mer å lære om konstruktører, for eksempel standardkonstruktører, tildelings- og kopikonstruktører. Disse vil bli diskutert i neste leksjon.

09

av 09

Rydde opp C ++ Destruktører

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

 ~ Sirkel ();


Når en gjenstand går utenfor omfanget eller mer sjelden blir eksplisitt ødelagt, kalles dens ødelegger. For eksempel, hvis objektet har dynamiske variabler som pekere, må de frigjøres og ødeleggeren er det rette stedet.

I motsetning til konstruktører, kan og bør destruktører gjøres virtuelle hvis du har avledede klasser. I Punkt og Sirkel klasser eksempel, er det ikke nødvendig å ødelegge fordi det ikke er noe opprydningsarbeid som skal gjøres (det fungerer bare som et eksempel). Hadde det vært dynamiske medlemsvariabler (som pekere) da ville de ha krevd frigjøring for å forhindre minnelekkasjer.

Når den avledede klassen legger til medlemmer som krever rydding, er det nødvendig med virtuelle destruktører. Når virtuell blir den mest avledede klassedestruktoren kalt først, så kalles den nærmeste stamfarens ødelegger, og så videre opp til baseklassen.

I vårt eksempel

 ~ Sirkel ();

deretter

 ~ Punkt ();


Basisklassen destructor kalles sist.

Dette fullfører denne leksjonen. I neste leksjon kan du lære om standardkonstruktører, kopiere konstruktører og oppgave.

instagram story viewer