C++ Klass och objekt med exempel
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 vara en prototyp fรถr ett hus. Den visar placering och storlekar pรฅ dรถrrar, fรถnster, golv etc. Utifrรฅn dessa beskrivningar kan vi bygga ett hus. Huset blir fรถremรฅlet. 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.
I figuren ovan har vi en prototyp fรถr ett enda hus. Frรฅn denna prototyp har vi skapat tvรฅ hus med olika funktioner.
Klassdeklaration
I C+ definieras en klass med nyckelordet klass. Detta ska fรถljas av klassnamnet. Klasskroppen lรคggs sedan till mellan hรคngslen { }.
syntax
class class-name
{
// data
// functions
};
- Klassnamnet รคr namnet som ska tilldelas klassen.
- Data รคr data fรถr klassen, normalt deklarerade som variabler.
- Funktionerna รคr klassfunktionerna.
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.
Objektdefinition
Objekt skapas frรฅn klasser. Klassobjekt deklareras pรฅ liknande sรคtt som variabler deklareras. Klassnamnet mรฅste bรถrja, fรถljt av objektnamnet. Objektet fรถr klasstypen.
syntax
class-name object-name;
- Klassnamnet รคr namnet pรฅ klassen frรฅn vilken ett objekt ska skapas.
- Objektnamnet รคr namnet som ska tilldelas det nya objektet.
Denna process att skapa ett objekt frรฅn en klass kallas instansiering.
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:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i vรฅr kod fรถr att kunna anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Deklarera en klass som heter Telefon.
- Anvรคnda public access-modifieraren fรถr att markera de variabler vi hรฅller pรฅ att skapa som offentligt tillgรคngliga.
- Deklarera den rรถrliga kostnaden fรถr en dubbel datatyp.
- Deklarera en heltalsvariabel med namnet slots.
- Slutet av klassens kropp.
- Anropar main()-funktionen. Programlogiken bรถr lรคggas till i dess kropp.
- Skapa ett objekt med namnet Y6 av typen Telefon. Detta kallas instansiering.
- Skapa ett objekt med namnet Y7 av typen Telefon. Detta kallas instansiering.
- 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.
- 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.
- 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.
- 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.
- Skriv ut kostnaden fรถr Y6 pรฅ konsolen tillsammans med annan text.
- Skriv ut kostnaden fรถr Y7 pรฅ konsolen tillsammans med annan text.
- Skriv ut antalet platser fรถr Y6 tillsammans med annan text.
- Skriv ut antalet platser fรถr Y7 tillsammans med annan text.
- Programmet mรฅste returnera ett vรคrde efter framgรฅngsrikt slutfรถrande.
- Slutet pรฅ huvuddelen av funktionen main().
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.
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 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:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Skapa en klass som heter ClassA.
- Anvรคnd public access modifier fรถr att markera klassmedlemmen som ska skapas som allmรคnt tillgรคnglig.
- Skapa funktionen som heter set_a() som tar ett heltalsvรคrde val.
- Skapa en funktion som heter get_a().
- Anvรคnd modifieraren fรถr privat รฅtkomst fรถr att markera klassmedlemmen som ska skapas som privat tillgรคnglig.
- Deklarera en heltalsvariabel med namnet a.
- Slutet av klassens kropp.
- 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.
- Funktionen get_a() ska returnera vรคrdet fรถr variabel a nรคr den anropas.
- Slutet pรฅ definitionen av funktionen get_a().
- 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.
- Tilldela variabeln vรคrdet till variabel a.
- Slutet pรฅ definitionen av funktionen set_a().
- Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
- Skapa en instans av ClassA och ge den namnet a.
- Anvรคnd ovanstรฅende klassinstans och funktionen set_a() fรถr att tilldela variabeln a ett vรคrde pรฅ 20.
- 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().
- Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
- Slutet pรฅ huvuddelen av funktion main().
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:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Skapa en klass som heter ParentClass.
- Anvรคnd modifieraren fรถr skyddad รฅtkomst fรถr att markera klassmedlemmen som ska skapas som skyddad.
- Skapa en heltalsvariabel med namnet vรคrde.
- Slutet av klassens kropp.
- Skapa en ny klass med namnet ChildClass som รคrver ParentClass.
- Anvรคnd modifieraren fรถr skyddad รฅtkomst fรถr att markera klassmedlemmen som ska skapas som tillgรคnglig fรถr barnklasser.
- Skapa funktionen med namnet setId() som tar ett heltalsvรคrde x.
- Tilldela vรคrdet fรถr variabeln x till variabelvรคrdet.
- Slutet pรฅ definitionen av funktionen setId().
- Skapa en funktion som heter displayValue().
- Skriv ut vรคrdet pรฅ variabelns namngivna vรคrde pรฅ konsolen tillsammans med annan text.
- Slutet pรฅ kroppen av funktionen displayValue().
- Slutet pรฅ brรถdtexten fรถr klassen som heter ChildClass.
- Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
- Skapa en instans av ChildClass och ge den namnet c.
- Anvรคnd ovanstรฅende klassinstans och funktionen setId() fรถr att tilldela variabeln x vรคrdet 21.
- Anvรคnd klassinstansen ovan fรถr att anropa funktionen med namnet displayValue().
- Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
- Slutet pรฅ huvuddelen av funktion main().
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 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;
}
Produktion:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i vรฅrt program fรถr att anvรคnda dess funktioner.
- Inkludera strรคnghuvudfilen i vรฅrt program fรถr att anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Skapa en klass med namnet Guru99.
- Anvรคnd modifieraren fรถr offentlig รฅtkomst fรถr att markera klassmedlemmarna som vi hรฅller pรฅ att skapa som allmรคnt tillgรคngliga.
- Skapa en strรคngvariabel med namnet tutorial_name.
- Skapa en heltalsvariabel med namnet id.
- Skapa en funktion som heter printname(). Denna funktion รคr inte definierad i klassdefinitionen.
- Skapa en funktion som heter printed(). Denna funktion รคr definierad i klassdefinitionen. Dess kropp har lagts till inom klassdefinitionen.
- 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.
- Slutet pรฅ funktionskroppen printid().
- Slutet av klassens kropp Guru99.
- Bรถrjan av definitionen av funktionen printname().
- 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.
- Slutet pรฅ definitionen av printname()-funktionen.
- Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
- Skapa en instans av klassen Guru99 och ger den namnet guru99.
- Anvรคnd ovanstรฅende instans fรถr att tilldela ett vรคrde pรฅ C++ till variabeln tutorial_name.
- Anvรคnd guru99-instansen fรถr att tilldela ett vรคrde pรฅ 1001 till variabel-id.
- Anvรคnd instansen guru99 fรถr att anropa funktionen printname() .
- Anropa kommandot slut (slutrad) fรถr att skriva ut en ny tom rad pรฅ konsolen.
- Anvรคnd instansen guru99 fรถr att anropa funktionen printid().
- Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
- Slutet pรฅ huvuddelen av funktionen main().
Konstruktรถrer och destruktรถrer
Vad รคr konstruktรถrer?
Konstruktioner รคr specialfunktioner som initierar objekt. De C++ kompilatorer anropar en konstruktor nรคr ett objekt skapas. Konstruktรถrerna hjรคlper till att tilldela klassmedlemmar vรคrden. Naturligtvis รคr detta efter att de har tilldelats lite minnesutrymme.
Vad รคr Destructors?
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 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;
}
}
Produktion:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i koden fรถr att anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Skapa en klass som heter ClassA.
- Anvรคnd modifieraren fรถr offentlig รฅtkomst fรถr att markera den medlem vi hรฅller pรฅ att skapa som allmรคnt tillgรคnglig.
- Skapa en konstruktor fรถr klassen.
- 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.
- Slutet pรฅ kroppen av klasskonstruktรถren.
- Skapa en destruktรถr fรถr klassen.
- 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.
- Slutet pรฅ destruktรถrens kropp.
- Slutet av klassens kropp.
- Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion.
- Skapa ett klassobjekt och ge det namnet a. Konstruktรถren kommer att kallas.
- Skapa en heltalsvariabel med namnet p och tilldela den vรคrdet 1.
- Skapa ett if-satsblock med variabeln p.
- Skapa ett klassobjekt och ge det namnet b. Fรถrstรถraren kommer att kallas.
- Slutet pรฅ brรถdtexten i if-satsen.
- Slutet pรฅ huvuddelen av funktionen main().
Sammanfattning
- C++ รคr objektorienterad.
- Klasser utgรถr huvuddragen i C++ som gรถr den objektorienterad.
- A C++ klass kombinerar data och metoder fรถr att manipulera data till en.
- En klass รคr en ritning fรถr ett objekt.
- Klasser bestรคmmer formen pรฅ ett objekt.
- Data och metoder som finns i en klass kallas klassmedlemmar.
- Fรถr att komma รฅt klassmedlemmar bรถr du anvรคnda en instans av klassen.
- Fรถr att skapa en klass anvรคnder vi nyckelordet klass.
- Klassmedlemsfunktionerna kan definieras i eller utanfรถr en klass.








