C++ Klass och objekt med exempel

โšก Smart sammanfattning

Klasser och objekt i C++ utgรถr grunden fรถr objektorienterad programmering, dรคr en klass definierar en ritning av data och medlemsfunktioner, och ett objekt รคr en konkret instans skapad frรฅn den ritning.

  • ๐Ÿ”ท Klassritning: A C++ klassen buntar samman datamedlemmar och medlemsfunktioner i en anvรคndardefinierad typ.
  • ๐Ÿ”‘ ร…tkomstmodifierare: Nyckelorden privat, offentlig och skyddad styr var klassmedlemmar kan nรฅs.
  • ๐Ÿงฑ Objektinstansiering: Ett objekt skapas frรฅn en klass med hjรคlp av syntaxen klassnamn objektnamn.
  • ๐Ÿ‘‰ Medlemsรฅtkomst: Punktoperatorn nรฅr offentliga medlemmar, medan medlemsfunktioner manipulerar den lagrade informationen.
  • โš™๏ธ Konstruktรถrer: Konstruktรถrer initierar objekt automatiskt, och destruktรถrer slรคpper dem nรคr de hamnar utanfรถr omfattningen.
  • ๐Ÿค– AI-hjรคlp: GitHub Copilot och liknande AI-assistenter skapar klassdefinitioner och konstruktรถrer frรฅn en kort kommentar.

C++ Klass och Objekt

Vad รคr en klass?

A C++ klass kombinerar data och metoder fรถr att manipulera data till en. Klasser bestรคmmer ocksรฅ formerna fรถr objekt. Data och metoder som finns i en klass kallas klassmedlemmar. En klass รคr en anvรคndardefinierad datatyp. Fรถr att komma รฅt klassmedlemmarna anvรคnder vi en instans av klassen. Du kan se en klass som en ritning fรถr ett objekt.

En klass kan vara en prototyp fรถr ett hus. Den visar placeringen och storleken pรฅ dรถrrar, fรถnster, golv etc. Utifrรฅn dessa beskrivningar kan vi konstruera ett hus. Huset blir objektet. Det รคr mรถjligt att skapa mรฅnga hus frรฅn prototypen. Det รคr ocksรฅ mรถjligt att skapa mรฅnga objekt frรฅn en klass.

C++ klass som en ritning fรถr objekt

I figuren ovan har vi en prototyp fรถr ett enda hus. Frรฅn denna prototyp har vi skapat tvรฅ hus med olika funktioner.

Med idรฉn om en klass som en ritning i รฅtanke รคr nรคsta steg att se hur en sรฅdan deklareras i kod.

Klassdeklaration

In C++, definieras en klass med hjรคlp av nyckelordet class. Detta bรถr fรถljas av klassnamnet. Klassens innehรฅll lรคggs sedan till mellan klammerparenteser { }.

syntax

class class-name
   {
   // data
   // functions
   };
  • Ocuco-landskapet klassnamn รคr namnet som ska tilldelas klassen.
  • Ocuco-landskapet datum รคr data fรถr klassen, normalt deklarerade som variabler.
  • Ocuco-landskapet funktioner รคr klassfunktionerna.

Att deklarera klassnamnet och brรถdtexten vรคcker naturligtvis frรฅgan om vem som fรฅr anvรคnda varje medlem.

Privata och offentliga sรถkord

Du mรฅste ha stรถtt pรฅ dessa tvรฅ nyckelord. De รคr รฅtkomstmodifierare.

Privat:

Nรคr det privata nyckelordet anvรคnds fรถr att definiera en funktion eller klass, blir det privat. Sรฅdana รคr endast tillgรคngliga inifrรฅn klassen.

Offentlig:

Det offentliga nyckelordet gรถr dรคremot data/funktioner offentliga. Dessa รคr tillgรคngliga utanfรถr klassen.

Efter att en klass existerar kan objekt skapas frรฅn den, ungefรคr som variabler skapas frรฅn en datatyp.

Objektdefinition

Objekt skapas frรฅn klasser. Klassobjekt deklareras pรฅ ett liknande sรคtt som variabler deklareras. Klassnamnet mรฅste komma fรถrst, fรถljt av objektnamnet. Objektet รคr av klasstypen.

syntax

class-name object-name;
  • Ocuco-landskapet klassnamn รคr namnet pรฅ den klass frรฅn vilken ett objekt ska skapas.
  • Ocuco-landskapet objektnamn รคr namnet som ska tilldelas det nya objektet.

Denna process att skapa ett objekt frรฅn en klass kallas instansiering.

Nรคr ett objekt har skapats kan dess publika medlemmar nรฅs direkt via en enkel operator.

Tillgรฅng till datamedlemmar

Fรถr att komma รฅt offentliga medlemmar i en klass anvรคnder vi (.)dot-operatorn. Dessa รคr medlemmar mรคrkta med public access modifier.

Exempelvis 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;
}

Produktion:

C++ รฅtkomst till offentliga datamedlemmar Exempel 1 utdata

Hรคr รคr en skรคrmdump av koden:

C++ รฅtkomst till offentliga datamedlemmar Exempel 1 kod

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att kunna anvรคnda dess funktioner.
  2. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  3. Deklarera en klass som heter Telefon.
  4. Anvรคnda public access-modifieraren fรถr att markera de variabler vi hรฅller pรฅ att skapa som offentligt tillgรคngliga.
  5. Deklarera den rรถrliga kostnaden fรถr en dubbel datatyp.
  6. Deklarera en heltalsvariabel med namnet slots.
  7. Slutet av klassens kropp.
  8. Anropar main()-funktionen. Programlogiken bรถr lรคggas till i dess kropp.
  9. Skapa ett objekt med namnet Y6 av typen Telefon. Detta kallas instansiering.
  10. Skapa ett objekt med namnet Y7 av typen Telefon. Detta kallas instansiering.
  11. Fรฅ tillgรฅng till variabel-/medlemskostnaden fรถr klass Telefon med hjรคlp av objektet Y6. Vรคrdet รคr satt till 100.0. Kostnaden fรถr Y6 รคr nu satt till 100.0.
  12. Fรฅ tillgรฅng till variabel-/medlemsplatserna i klass Telefon med hjรคlp av objektet Y6. Vรคrdet รคr satt till 2. Facket fรถr Y6 รคr nu satt till 2.
  13. Fรฅ tillgรฅng till variabel-/medlemskostnaden fรถr klass Telefon med hjรคlp av objektet Y7. Vรคrdet รคr satt till 200.0. Kostnaden fรถr Y7 รคr nu satt till 200.0.
  14. Fรฅ tillgรฅng till variabel-/medlemsplatserna i klass Telefon med hjรคlp av objektet Y7. Vรคrdet รคr satt till 2. Facket fรถr Y7 รคr nu satt till 2.
  15. Skriv ut kostnaden fรถr Y6 pรฅ konsolen tillsammans med annan text.
  16. Skriv ut kostnaden fรถr Y7 pรฅ konsolen tillsammans med annan text.
  17. Skriv ut antalet platser fรถr Y6 tillsammans med annan text.
  18. Skriv ut antalet platser fรถr Y7 tillsammans med annan text.
  19. Programmet mรฅste returnera ett vรคrde efter framgรฅngsrikt slutfรถrande.
  20. Slutet pรฅ huvuddelen av funktionen main().

Offentliga medlemmar รคr รถppna fรถr extern kod, men privata medlemmar fรถljer mycket strรคngare รฅtkomstregler.

Vad รคr en privatklass?

Klassmedlemmar markerade som privata kan endast nรฅs av funktioner definierade inom klassen. Alla objekt eller funktioner som definieras utanfรถr klassen kan inte komma รฅt sรฅdana medlemmar direkt. En privat klassmedlem nรฅs endast av medlems- och vรคnfunktioner.

Exempelvis 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;
}

Produktion:

C++ privat klassmedlem Exempel 2 utdata

Hรคr รคr en skรคrmdump av koden:

C++ privat klassmedlem Exempel 2 kod

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  2. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  3. Skapa en klass som heter ClassA.
  4. Anvรคnd public access modifier fรถr att markera klassmedlemmen som ska skapas som allmรคnt tillgรคnglig.
  5. Skapa funktionen som heter set_a() som tar ett heltalsvรคrde val.
  6. Skapa en funktion som heter get_a().
  7. Anvรคnd modifieraren fรถr privat รฅtkomst fรถr att markera klassmedlemmen som ska skapas som privat tillgรคnglig.
  8. Deklarera en heltalsvariabel med namnet a.
  9. Slutet av klassens kropp.
  10. Anvรคnd klassnamnet och scope resolution operatorn fรถr att komma รฅt funktionen get_a(). Vi vill definiera vad funktionen gรถr nรคr den anropas.
  11. Funktionen get_a() ska returnera vรคrdet fรถr variabel a nรคr den anropas.
  12. Slutet pรฅ definitionen av funktionen get_a().
  13. Anvรคnd klassnamnet och scope resolution operatorn fรถr att komma รฅt funktionen set_a(). Vi vill definiera vad funktionen gรถr nรคr den anropas.
  14. Tilldela variabeln vรคrdet till variabel a.
  15. Slutet pรฅ definitionen av funktionen set_a().
  16. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  17. Skapa en instans av ClassA och ge den namnet a.
  18. Anvรคnd ovanstรฅende klassinstans och funktionen set_a() fรถr att tilldela variabeln a ett vรคrde pรฅ 20.
  19. Skriver ut lite text tillsammans med vรคrdet fรถr variabel a pรฅ konsolen. Vรคrdet pรฅ variabel a erhรฅlls genom att anropa funktionen get_a().
  20. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  21. Slutet pรฅ huvuddelen av funktion main().

Skyddade medlemmar sitter mellan privat och offentlig, vilket lรคgger till en viktig funktion fรถr arv.

Vad รคr en skyddad klass?

Klassmedlemmar som รคr markerade som skyddade har en fรถrdel framfรถr de som รคr markerade som privata. De kan nรฅs av funktioner inom klassen fรถr deras definition. Dessutom kan de nรฅs frรฅn hรคrledda klasser.

Exempelvis 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;
}

Produktion:

C++ skyddad klassmedlem Exempel 3 utdata

Hรคr รคr en skรคrmdump av koden:

C++ skyddad klassarv Exempel 3 kod

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
  2. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  3. Skapa en klass som heter ParentClass.
  4. Anvรคnd modifieraren fรถr skyddad รฅtkomst fรถr att markera klassmedlemmen som ska skapas som skyddad.
  5. Skapa en heltalsvariabel med namnet vรคrde.
  6. Slutet av klassens kropp.
  7. Skapa en ny klass med namnet ChildClass som รคrver ParentClass.
  8. Anvรคnd modifieraren fรถr skyddad รฅtkomst fรถr att markera klassmedlemmen som ska skapas som tillgรคnglig fรถr barnklasser.
  9. Skapa funktionen med namnet setId() som tar ett heltalsvรคrde x.
  10. Tilldela vรคrdet fรถr variabeln x till variabelvรคrdet.
  11. Slutet pรฅ definitionen av funktionen setId().
  12. Skapa en funktion som heter displayValue().
  13. Skriv ut vรคrdet pรฅ variabelns namngivna vรคrde pรฅ konsolen tillsammans med annan text.
  14. Slutet pรฅ kroppen av funktionen displayValue().
  15. Slutet pรฅ brรถdtexten fรถr klassen som heter ChildClass.
  16. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  17. Skapa en instans av ChildClass och ge den namnet c.
  18. Anvรคnd ovanstรฅende klassinstans och funktionen setId() fรถr att tilldela variabeln x vรคrdet 21.
  19. Anvรคnd klassinstansen ovan fรถr att anropa funktionen med namnet displayValue().
  20. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  21. Slutet pรฅ huvuddelen av funktion main().

Fรถrutom att lagra data grupperar en klass รคven de funktioner som arbetar med den datan.

Klassmedlemsfunktioner

Funktioner hjรคlper oss att manipulera data. Klassmedlemsfunktioner kan definieras pรฅ tvรฅ sรคtt:

  • Inuti klassdefinitionen
  • Utanfรถr klassdefinitionen

Om en funktion ska definieras utanfรถr en klassdefinition mรฅste vi anvรคnda scope resolution operator (::). Detta bรถr รฅtfรถljas av klass- och funktionsnamn.

Exempelvis 4

#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;
}

Produktion:

C++ Klassmedlemsfunktioner Exempel 4 utdata

Hรคr รคr en skรคrmdump av koden:

C++ klassmedlemsfunktioner Exempel 4 kod

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i vรฅrt program fรถr att anvรคnda dess funktioner.
  2. Inkludera strรคnghuvudfilen i vรฅrt program fรถr att anvรคnda dess funktioner.
  3. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  4. Skapa en klass med namnet Guru99.
  5. Anvรคnd modifieraren fรถr offentlig รฅtkomst fรถr att markera de klassmedlemmar vi ska skapa som offentligt tillgรคngliga.
  6. Skapa en strรคngvariabel med namnet tutorial_name.
  7. Skapa en heltalsvariabel med namnet id.
  8. Skapa en funktion som heter printname(). Denna funktion รคr inte definierad i klassdefinitionen.
  9. Skapa en funktion med namnet printid(). Denna funktion รคr definierad i klassdefinitionen. Dess brรถdtext har lagts till i klassdefinitionen.
  10. Skriv ut vรคrdet fรถr variabel-id tillsammans med annan text pรฅ konsolen. Observera att detta har lagts till i huvuddelen av printid()-funktionen. Den kommer bara att kรถras nรคr funktionen printid() anropas.
  11. Slutet pรฅ funktionskroppen printid().
  12. Slutet av klassens kropp Guru99.
  13. Bรถrjan av definitionen av funktionen printname().
  14. Skriv ut vรคrdet fรถr variabeln tutorial_name pรฅ konsolen tillsammans med annan text. Observera att detta har lagts till i funktionen printname()s brรถdtext. Den kommer bara att kรถras nรคr funktionen printname() anropas.
  15. Slutet pรฅ definitionen av printname()-funktionen.
  16. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  17. Skapa en instans av klassen Guru99 och ger den namnet guru99.
  18. Anvรคnd ovanstรฅende instans fรถr att tilldela ett vรคrde pรฅ C++ till variabeln tutorial_name.
  19. Anvรคnd guru99-instansen fรถr att tilldela ett vรคrde pรฅ 1001 till variabel-id.
  20. Anvรคnd instansen guru99 fรถr att anropa funktionen printname() .
  21. Anropa kommandot slut (slutrad) fรถr att skriva ut en ny tom rad pรฅ konsolen.
  22. Anvรคnd instansen guru99 fรถr att anropa funktionen printid().
  23. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  24. Slutet pรฅ huvuddelen av funktionen main().

Tvรฅ speciella medlemsfunktioner kรถrs automatiskt nรคr ett objekt skapas och nรคr det fรถrstรถrs.

Konstruktรถrer och destruktรถrer

Vad รคr en konstruktรถr?

Konstruktorer รคr specialfunktioner som initierar objekt. C++ kompilatorer anropa en konstruktor nรคr man skapar ett objekt. Konstruktorerna hjรคlper till att tilldela vรคrden till klassmedlemmar. Naturligtvis sker detta efter att de har allokerats minnesutrymme.

Vad รคr en destruktor?

Destruktรถrer รฅ andra sidan hjรคlper till att fรถrstรถra klassobjekt.

Konstruktornamnet mรฅste likna klassnamnet. Konstruktรถrer har ingen returtyp.

Konstruktorn kan definieras inom eller utanfรถr klasskroppen. Om den definieras utanfรถr klasskroppen bรถr den definieras med klassnamnet och scope resolution operator (::).

Exempelvis 5

#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; 
		}   
}

Produktion:

C++ konstruktor och destruktor Exempel 5 utdata

Hรคr รคr en skรคrmdump av koden:

C++ konstruktor och destruktor Exempel 5 kod

Code Fรถrklaring:

  1. Inkludera iostream-huvudfilen i koden fรถr att anvรคnda dess funktioner.
  2. Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
  3. Skapa en klass som heter ClassA.
  4. Anvรคnd modifieraren fรถr offentlig รฅtkomst fรถr att markera den medlem vi hรฅller pรฅ att skapa som allmรคnt tillgรคnglig.
  5. Skapa en konstruktor fรถr klassen.
  6. Text att skriva ut pรฅ konsolen nรคr konstruktorn anropas. ร„nden รคr en C++ nyckelord, vilket betyder slutrad. Den flyttar muspekaren till nรคsta rad.
  7. Slutet pรฅ kroppen av klasskonstruktรถren.
  8. Skapa en destruktรถr fรถr klassen.
  9. Text att skriva ut pรฅ konsolen nรคr fรถrstรถraren anropas. ร„nden รคr en C++ nyckelord, vilket betyder slutrad. Den flyttar muspekaren till nรคsta rad.
  10. Slutet pรฅ destruktรถrens kropp.
  11. Slutet av klassens kropp.
  12. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
  13. Skapa ett klassobjekt och ge det namnet a. Konstruktรถren kommer att kallas.
  14. Skapa en heltalsvariabel med namnet p och tilldela den vรคrdet 1.
  15. Skapa ett if-satsblock med variabeln p.
  16. Skapa ett klassobjekt och ge det namnet b. Fรถrstรถraren kommer att kallas.
  17. Slutet pรฅ brรถdtexten i if-satsen.
  18. Slutet pรฅ huvuddelen av funktionen main().

Vanliga frรฅgor

En klass รคr en anvรคndardefinierad ritning som grupperar datamedlemmar och medlemsfunktioner i en typ. Ett objekt รคr en konkret instans byggd frรฅn den klassen och som innehรฅller sin egen kopia av de data som beskrivs i ritningsplanen.

Den stรถrsta skillnaden รคr standardรฅtkomst: medlemmar i en klass รคr privata som standard, medan medlemmar i en struktur รคr publika som standard. Bรฅda stรถder arv, konstruktorer och inkapsling i C++.

C++ stรถder tre vanliga konstruktortyper: en standardkonstruktor utan argument, en parametriserad konstruktor som accepterar vรคrden fรถr att initiera medlemmar och en kopieringskonstruktor som skapar ett nytt objekt frรฅn ett befintligt objekt av samma klass.

En friend-funktion รคr en icke-medlemsfunktion som beviljas รฅtkomst till de privata och skyddade medlemmarna i en klass. Den deklareras inuti klassen med nyckelordet friend, men definieras utanfรถr den som en vanlig funktion.

`this`-pekaren รคr en implicit pekare som รคr tillgรคnglig i varje icke-statisk medlemsfunktion. Den pekar pรฅ objektet som anropade funktionen, vilket gรถr att koden kan referera till objektets egna medlemmar och lรถsa namnkonflikter mellan parametrar och datamedlemmar.

Inkapsling buntar data och de funktioner som arbetar med den i en enda klass och dรถljer sedan interna detaljer med hjรคlp av privata medlemmar. Offentliga medlemsfunktioner exponerar ett kontrollerat grรคnssnitt som skyddar data frรฅn oavsiktlig eller obehรถrig รฅtkomst.

Ja. AI-kodningsassistenter omvandlar en kort prompt eller kommentar till arbetsklassdefinitioner, inklusive datamedlemmar, รฅtkomstspecifikationer, konstruktorer och medlemsfunktioner. Granska alltid de genererade รฅtkomstnivรฅerna och initialiseringslogiken innan du kompilerar koden.

Ja. GitHub Copilot fรถreslรฅr klassdeklarationer, konstruktorer, getters och setters medan du skriver. Den hanterar repetitiva standardinstรคllningar snabbt, men du bรถr fortfarande verifiera medlemsรฅtkomst, konstruktorlogik och objektanvรคndning innan du bygger.

Sammanfatta detta inlรคgg med: