C++ Klasse og objekt med eksempel

Hvad er en klasse?

A C++ klasse kombinerer data og metoder til at manipulere dataene til รฉn. Klasser bestemmer ogsรฅ objekternes form. Dataene og metoderne i en klasse er kendt som klassemedlemmer. En klasse er en brugerdefineret datatype. For at fรฅ adgang til klassens medlemmer bruger vi en forekomst af klassen. Du kan se en klasse som en blueprint for et objekt.

En klasse vรฆre en prototype til et hus. Den viser placering og stรธrrelser af dรธre, vinduer, gulve osv. Ud fra disse beskrivelser kan vi opfรธre et hus. Huset bliver objektet. Det er muligt at lave mange huse ud fra prototypen. Det er ogsรฅ muligt at oprette mange objekter fra en klasse.

C++ Klasse

I ovenstรฅende figur har vi en enkelt husprototype. Ud fra denne prototype har vi skabt to huse med forskellige funktioner.

Klasseerklรฆring

I C+ defineres en klasse ved hjรฆlp af klassenรธgleordet. Dette skal efterfรธlges af klassenavnet. Klassens krop tilfรธjes derefter mellem krรธllede klammeparenteser { }.

Syntaks

class class-name
   {
   // data
   // functions
   };
  • Klassenavnet er det navn, der skal tildeles til klassen.
  • Dataene er dataene for klassen, normalt erklรฆret som variable.
  • Funktionerne er klassefunktionerne.

Private og offentlige sรธgeord

Du mรฅ vรฆre stรธdt pรฅ disse to sรธgeord. De er adgangsmodifikatorer.

  • Privat:

Nรฅr det private nรธgleord bruges til at definere en funktion eller klasse, bliver det privat. Sรฅdanne er kun tilgรฆngelige inde fra klassen.

  • Offentlig:

Det offentlige sรธgeord gรธr derimod data/funktioner offentlige. Disse er tilgรฆngelige uden for klassen.

Objektdefinition

Objekter oprettes ud fra klasser. Klasseobjekter erklรฆres pรฅ samme mรฅde som variabler erklรฆres. Klassenavnet skal starte efterfulgt af objektnavnet. Objektet for klassetypen.

Syntaks

class-name object-name;
  • Klassenavnet er navnet pรฅ den klasse, hvorfra et objekt skal oprettes.
  • Objektnavnet er det navn, der skal tildeles det nye objekt.

Denne proces med at skabe et objekt fra en klasse er kendt som instansiering.

Adgang til datamedlemmer

For at fรฅ adgang til offentlige medlemmer af en klasse bruger vi (.)dot-operatoren. Disse er medlemmer markeret med offentlig adgangsmodifikator.

Eksempel 1

#include <iostream>
using namespace std;
class Phone {
public:
	double cost;   
	int slots; 
};
int main() {
	Phone Y6;        
	Phone Y7;        

	Y6.cost = 100.0;
	Y6.slots = 2;

	Y7.cost = 200.0;
	Y7.slots = 2;
	cout << "Cost of Huawei Y6 : " << Y6.cost << endl;
	cout << "Cost of Huawei Y7 : " << Y7.cost << endl;

	cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl;
	cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl;

	return 0;
}

Output:

Adgang til datamedlemmer

Her er et skรฆrmbillede af koden:

Adgang til datamedlemmer

Kode Forklaring:

  1. Inkluder iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluderer std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  3. Erklรฆr en klasse ved navn Telefon.
  4. Brug af public access modifier til at markere de variabler, vi er ved at oprette, som offentligt tilgรฆngelige.
  5. Angiv de variable omkostninger for en dobbelt datatype.
  6. Deklarer en heltalsvariabel ved navn slots.
  7. Slutningen af โ€‹โ€‹klassens krop.
  8. Kalder hoved()-funktionen. Programlogikken skal tilfรธjes i dens krop.
  9. Opret et objekt med navnet Y6 af typen Telefon. Dette kaldes instansiering.
  10. Opret et objekt med navnet Y7 af typen Telefon. Dette kaldes instansiering.
  11. Fรฅ adgang til den variable/medlemspris for klasse Telefon ved hjรฆlp af objektet Y6. Vรฆrdien er sat til 100.0. Prisen pรฅ Y6 er nu sat til 100.0.
  12. Fรฅ adgang til variable/medlemspladserne i klasse Telefon ved hjรฆlp af objektet Y6. Vรฆrdien er sat til 2. Slots for Y6 er nu sat til 2.
  13. Fรฅ adgang til den variable/medlemspris for klasse Telefon ved hjรฆlp af objektet Y7. Vรฆrdien er sat til 200.0. Prisen pรฅ Y7 er nu sat til 200.0.
  14. Fรฅ adgang til variable/medlemspladserne i klasse Telefon ved hjรฆlp af objektet Y7. Vรฆrdien er sat til 2. Slots for Y7 er nu sat til 2.
  15. Udskriv prisen pรฅ Y6 pรฅ konsollen sammen med anden tekst.
  16. Udskriv prisen pรฅ Y7 pรฅ konsollen sammen med anden tekst.
  17. Udskriv antallet af pladser til Y6 sammen med anden tekst.
  18. Udskriv antallet af pladser til Y7 sammen med anden tekst.
  19. Programmet skal returnere en vรฆrdi efter vellykket afslutning.
  20. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktionen main().

Hvad er en privat klasse?

Klassemedlemmer markeret som private kan kun tilgรฅs af funktioner defineret i klassen. Ethvert objekt eller funktion defineret uden for klassen kan ikke fรฅ direkte adgang til sรฅdanne medlemmer. Et privat klassemedlem er kun tilgรฅet af medlems- og vennefunktioner.

Hvad er en beskyttet klasse?

Klassemedlemmer, der er markeret som beskyttede, har en fordel i forhold til dem, der er markeret som private. De kan tilgรฅs af funktioner inden for klassen for deres definition. Derudover kan de tilgรฅs fra afledte klasser.

Eksempel 2

#include <iostream>
using namespace std;
class ClassA {
public:
	void set_a(int val);
	int get_a(void);

private:
	int a;
};
int ClassA::get_a(void) {
	return a;
}
void ClassA::set_a(int val) {
	a = val;
}
int main() {
	ClassA a;
	a.set_a(20); 
	cout << "Value of a is: " << a.get_a(); 
	return 0;
}

Output:

Adgang til datamedlemmer

Her er et skรฆrmbillede af koden:

Adgang til datamedlemmer

Kodeforklaring:

  1. Inkluder iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  3. Opret en klasse ved navn ClassA.
  4. Brug offentlig adgangsmodifikator til at markere klassemedlemmet, der skal oprettes, som offentligt tilgรฆngeligt.
  5. Opret funktionen med navnet set_a(), der tager en heltalsvรฆrdi val.
  6. Opret en funktion ved navn get_a().
  7. Brug den private adgangsmodifikator til at markere det klassemedlem, der skal oprettes, som privat tilgรฆngeligt.
  8. Erklรฆre en heltalsvariabel ved navn a.
  9. Slutningen af โ€‹โ€‹klassens krop.
  10. Brug klassenavnet og scope resolution operatoren for at fรฅ adgang til funktionen get_a(). Vi รธnsker at definere, hvad funktionen gรธr, nรฅr den aktiveres.
  11. Funktionen get_a() skal returnere vรฆrdien af โ€‹โ€‹variabel a, nรฅr den aktiveres.
  12. Slut pรฅ definitionen af โ€‹โ€‹funktionen get_a().
  13. Brug klassenavnet og scope resolution operatoren for at fรฅ adgang til funktionen set_a(). Vi รธnsker at definere, hvad funktionen gรธr, nรฅr den aktiveres.
  14. Tildeling af vรฆrdien af โ€‹โ€‹variablen val til variabel a.
  15. Slut pรฅ definition af funktionen sรฆt_a().
  16. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktions brรธdtekst.
  17. Opret en forekomst af ClassA og giv den navnet a.
  18. Brug ovenstรฅende klasseinstans og funktionen set_a() til at tildele en vรฆrdi pรฅ 20 til variablen a.
  19. Udskrivning af noget tekst ved siden af โ€‹โ€‹vรฆrdien af โ€‹โ€‹variabel a pรฅ konsollen. Vรฆrdien af โ€‹โ€‹variabel a fรฅs ved at kalde funktionen get_a() .
  20. Programmet skal returnere vรฆrdi efter vellykket afslutning.
  21. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktion main().

Eksempel 3

#include <iostream>
using namespace std;
class ParentClass {
protected:
	int value;
};
class ChildClass : public ParentClass {
public:
	void setId(int x) {
		value = x;
	}
	void displayValue() {
	cout << "Value is: " << value << endl;
	}
};
int main() {
	ChildClass c;
	c.setId(21);
	c.displayValue();
	return 0;
}

Output:

Adgang til datamedlemmer

Her er et skรฆrmbillede af koden:

Adgang til datamedlemmer

Kodeforklaring:

  1. Inkluder iostream-headerfilen i vores kode for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  3. Opret en klasse med navnet ParentClass.
  4. Brug den beskyttede adgangsmodifikator til at markere det klassemedlem, der skal oprettes, som beskyttet.
  5. Opret en heltalsvariabel med navnet vรฆrdi.
  6. Slutningen af โ€‹โ€‹klassens krop.
  7. Opret en ny klasse ved navn ChildClass, der arver ParentClass.
  8. Brug den beskyttede adgangsmodifikator til at markere det klassemedlem, der skal oprettes, som tilgรฆngeligt for bรธrneklasser.
  9. Opret funktionen ved navn setId(), der tager en heltalsvรฆrdi x.
  10. Tildeling af vรฆrdien af โ€‹โ€‹variablen x til variabelvรฆrdien.
  11. Slut pรฅ definition af funktionen setId().
  12. Opret en funktion ved navn displayValue().
  13. Udskriv vรฆrdien af โ€‹โ€‹variabelens navngivne vรฆrdi pรฅ konsollen sammen med anden tekst.
  14. Slutningen af โ€‹โ€‹brรธdteksten af โ€‹โ€‹funktionen displayValue().
  15. Slutningen af โ€‹โ€‹brรธdteksten i klassen ved navn ChildClass.
  16. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktions brรธdtekst.
  17. Opret en instans af ChildClass og giv den navnet c.
  18. Brug ovenstรฅende klasseinstans og funktionen setId() til at tildele en vรฆrdi pรฅ 21 til variablen x.
  19. Brug ovenstรฅende klasseinstans til at kalde funktionen med navnet displayValue().
  20. Programmet skal returnere vรฆrdi efter vellykket afslutning.
  21. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktion main().

Klassemedlemsfunktioner

Funktioner hjรฆlper os med at manipulere data. Klassemedlemsfunktioner kan defineres pรฅ to mรฅder:

  • Inde i klassedefinitionen
  • Uden for klassedefinitionen

Hvis en funktion skal defineres uden for en klassedefinition, skal vi bruge scope resolution operatoren (::). Dette skal ledsages af klasse- og funktionsnavnene.

Eksempel 2

#include <iostream>
#include <string>
using namespace std;
class Guru99
{
public:
	string tutorial_name;
	int id;
	void printname();
	void printid()
	{
		cout << "Tutorial id is: "<< id;
	}
};
void Guru99::printname()
{
	cout << "Tutorial name is: " << tutorial_name;
}
int main() {
	Guru99 guru99;
	guru99.tutorial_name = "C++";
	guru99.id = 1001;
	guru99.printname();
	cout << endl;
	guru99.printid();
	return 0;
}

Output:

Klassemedlemsfunktioner

Her er et skรฆrmbillede af koden:

Klassemedlemsfunktioner

Kodeforklaring:

  1. Inkluder iostream-headerfilen i vores program for at bruge dens funktioner.
  2. Inkluder strenghovedfilen i vores program for at bruge dens funktioner.
  3. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  4. Opret en klasse ved navn Guru99.
  5. Brug public access modifier til at markere de klassemedlemmer, vi er ved at oprette, som offentligt tilgรฆngelige.
  6. Opret en strengvariabel med navnet tutorial_name.
  7. Opret en heltalsvariabel med navnet id.
  8. Opret en funktion ved navn printname(). Denne funktion er ikke defineret i klassedefinitionen.
  9. Opret en funktion med navnet printed(). Denne funktion er defineret i klassedefinitionen. Dens krop er blevet tilfรธjet inden for klassedefinitionen.
  10. Udskriv vรฆrdien af โ€‹โ€‹variabel-id sammen med anden tekst pรฅ konsollen. Bemรฆrk, at dette er blevet tilfรธjet i brรธdteksten af โ€‹โ€‹printid()-funktionen. Det vil kun blive udfรธrt, nรฅr printid()-funktionen kaldes.
  11. Slutningen af โ€‹โ€‹brรธdteksten af โ€‹โ€‹funktion printid().
  12. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹klassen Guru99.
  13. Starten pรฅ definitionen af โ€‹โ€‹funktionen printname().
  14. Udskriv vรฆrdien af โ€‹โ€‹variabel tutorial_name pรฅ konsollen sammen med anden tekst. Bemรฆrk, at dette er blevet tilfรธjet i brรธdteksten af โ€‹โ€‹printname()-funktionen. Det vil kun blive udfรธrt, nรฅr funktionen printname() kaldes.
  15. Slut pรฅ definitionen af โ€‹โ€‹printname() funktion.
  16. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktions brรธdtekst.
  17. Opret en instans af klassen Guru99 og giv den navnet guru99.
  18. Brug ovenstรฅende instans til at tildele en vรฆrdi af C++ til variablen tutorial_name.
  19. Brug guru99-forekomsten til at tildele en vรฆrdi pรฅ 1001 til variabel-id.
  20. Brug forekomsten guru99 til at kalde funktionen printname() .
  21. Kald kommandoen slut (slutlinje) for at udskrive en ny tom linje pรฅ konsollen.
  22. Brug forekomsten guru99 til at kalde funktionen printid().
  23. Programmet skal returnere vรฆrdi efter vellykket afslutning.
  24. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktionen main().

Konstruktรธrer og destruktorer

Hvad er konstruktรธrer?

Konstruktioner er specielle funktioner, der initialiserer objekter. Det C++ compilere kalder en konstruktรธr, nรฅr du opretter et objekt. Konstruktรธrerne hjรฆlper med at tildele vรฆrdier til klassemedlemmer. Det er selvfรธlgelig efter, at de har fรฅet tildelt noget hukommelsesplads.

Hvad er Destructors?

Destruktorer pรฅ den anden side hjรฆlper med at รธdelรฆgge klasseobjekter.

Konstruktรธrnavnet skal svare til klassenavnet. Konstruktรธrer har ikke en returtype.

Konstruktรธren kan defineres i eller uden for klassens krop. Hvis den er defineret uden for klassens krop, skal den defineres med klassenavnet og scope resolution operatoren (::).

Eksempel 3

#include <iostream>  
using namespace std;
class ClassA {
public:
	ClassA() {
		cout << "Class constructor called"<<endl;
	}
	~ClassA() {
		cout << "Class destructor called"<<endl;
	}
};

int main() {
	ClassA a;
	int p = 1;
		if (p) {
			ClassA b; 
		}   
}

Output:

Konstruktรธrer og destruktorer

Her er et skรฆrmbillede af koden:

Konstruktรธrer og destruktorer

Kodeforklaring:

  1. Inkluder iostream-headerfilen i koden for at bruge dens funktioner.
  2. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  3. Opret en klasse ved navn ClassA.
  4. Brug offentlig adgangsmodifikator til at markere det medlem, vi er ved at oprette, som offentligt tilgรฆngeligt.
  5. Opret en konstruktรธr til klassen.
  6. Tekst til udskrivning pรฅ konsollen, nรฅr konstruktรธren kaldes. Endl er en C++ sรธgeord, hvilket betyder slutlinje. Det flytter musemarkรธren til nรฆste linje.
  7. Slutningen af โ€‹โ€‹kroppen af โ€‹โ€‹klassekonstruktรธren.
  8. Opret en destruktor til klassen.
  9. Tekst, der skal udskrives pรฅ konsollen, nรฅr destruktoren kaldes. Endl er en C++ sรธgeord, hvilket betyder slutlinje. Det flytter musemarkรธren til nรฆste linje.
  10. Enden af โ€‹โ€‹destruktorens krop.
  11. Slutningen af โ€‹โ€‹klassens krop.
  12. Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktions brรธdtekst.
  13. Opret et klasseobjekt og giv det navnet a. Konstruktรธren vil blive tilkaldt.
  14. Opret en heltalsvariabel ved navn p og tildel den en vรฆrdi pรฅ 1.
  15. Opret en if-sรฆtningsblok ved hjรฆlp af variablen p.
  16. Opret et klasseobjekt og giv det navnet b. Destruktoren vil blive tilkaldt.
  17. Slutningen af โ€‹โ€‹brรธdteksten i if-erklรฆringen.
  18. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktionen main().

Resumรฉ

  • C++ er objektorienteret.
  • Klasser udgรธr hovedtrรฆk ved C++ som gรธr det objektorienteret.
  • A C++ klasse kombinerer data og metoder til at manipulere dataene til รฉn.
  • En klasse er en blueprint for et objekt.
  • Klasser bestemmer formen pรฅ et objekt.
  • Dataene og metoderne i en klasse er kendt som klassemedlemmer.
  • For at fรฅ adgang til klassemedlemmer skal du bruge en forekomst af klassen.
  • For at oprette en klasse bruger vi klassens nรธgleord.
  • Klassemedlemsfunktionerne kan defineres i eller uden for en klasse.

Opsummer dette indlรฆg med: