C++ Klasse en object met voorbeeld
Wat is een klasse?
A C++ klasse combineert gegevens en methoden voor het manipuleren van de gegevens in één. Klassen bepalen ook de vormen van objecten. De gegevens en methoden in een klasse worden klasseleden genoemd. Een klasse is een door de gebruiker gedefinieerd gegevenstype. Om toegang te krijgen tot de klasleden, gebruiken we een exemplaar van de klas. Je kunt een klasse zien als een blauwdruk voor een object.
Een klasse is een prototype voor een huis. Het toont de locatie en afmetingen van deuren, ramen, vloeren, etc. Vanuit deze beschrijvingen kunnen we een huis construeren. Het huis wordt het object. Het is mogelijk om veel huizen te creëren vanuit het prototype. Het is ook mogelijk om veel objecten te creëren vanuit een klasse.
In de bovenstaande afbeelding hebben we een prototype voor één huis. Van dit prototype hebben we twee huizen met verschillende kenmerken gemaakt.
Klasseverklaring
In C+ wordt een klasse gedefinieerd met behulp van het trefwoord class. Dit moet worden gevolgd door de klassenaam. De class body wordt vervolgens tussen accolades { } toegevoegd.
Syntaxis
class class-name { // data // functions };
- De klassenaam is de naam die aan de klasse moet worden toegewezen.
- De gegevens zijn de gegevens voor de klasse, normaal gesproken gedeclareerd als variabelen.
- De functies zijn de klassefuncties.
Privé- en openbare trefwoorden
Deze twee zoekwoorden ben je vast wel eens tegengekomen. Het zijn toegangsmodificatoren.
- private:
Wanneer het private sleutelwoord wordt gebruikt om een functie of klasse te definiëren, wordt het privé. Deze zijn alleen toegankelijk vanuit de klas.
- Openbaar:
Het publieke trefwoord daarentegen maakt gegevens/functies openbaar. Deze zijn toegankelijk van buiten de klas.
Objectdefinitie
Objecten worden gemaakt op basis van klassen. Klasseobjecten worden op dezelfde manier gedeclareerd als variabelen. De klassenaam moet beginnen, gevolgd door de objectnaam. Het object van het klassetype.
Syntaxis
class-name object-name;
- De klassenaam is de naam van de klasse waaruit een object moet worden gemaakt.
- De objectnaam is de naam die aan het nieuwe object moet worden toegewezen.
Dit proces waarbij een object uit een klasse wordt gemaakt, staat bekend als instantiatie.
Toegang tot gegevensleden
Om toegang te krijgen tot openbare leden van een klasse, gebruiken we de (.)dot operator. Dit zijn leden die gemarkeerd zijn met de openbare toegangsmodifier.
Voorbeeld 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:
Hier is een screenshot van de code:
Code Uitleg:
- Neem het iostream-headerbestand op in onze code om de functies ervan te gebruiken.
- Inclusief de std-naamruimte in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
- Declareer een klasse met de naam Phone.
- Gebruik de modifier voor openbare toegang om de variabelen die we gaan maken als openbaar toegankelijk te markeren.
- Declareer de variabele kosten van een dubbel gegevenstype.
- Declareer een geheel getalvariabele met de naam slots.
- Einde van het klassenlichaam.
- De functie main() aanroepen. De programmalogica moet in de hoofdtekst worden toegevoegd.
- Maak een object met de naam Y6 van het type Telefoon. Dit wordt instantiatie genoemd.
- Maak een object met de naam Y7 van het type Telefoon. Dit wordt instantiatie genoemd.
- Krijg toegang tot de variabele/ledenkosten van klasse Telefoon met behulp van het object Y6. De waarde is ingesteld op 100.0. De kosten van Y6 zijn nu ingesteld op 100.0.
- Krijg toegang tot de variabele/ledenslots van de klasse Phone met behulp van het object Y6. De waarde is ingesteld op 2. De slots voor Y6 zijn nu ingesteld op 2.
- Krijg toegang tot de variabele/ledenkosten van klasse Telefoon met behulp van het object Y7. De waarde is ingesteld op 200.0. De kosten van Y7 zijn nu ingesteld op 200.0.
- Krijg toegang tot de variabele/ledenslots van de klasse Phone met behulp van het object Y7. De waarde is ingesteld op 2. De slots voor Y7 zijn nu ingesteld op 2.
- Druk de kosten van Y6 af op de console, samen met andere tekst.
- Druk de kosten van Y7 af op de console, samen met andere tekst.
- Druk het aantal slots voor Y6 af naast andere tekst.
- Druk het aantal slots voor Y7 af naast andere tekst.
- Het programma moet bij succesvolle voltooiing een waarde retourneren.
- Einde van de hoofdtekst van de functie main().
Wat is een privéles?
Klassenleden die als privé zijn gemarkeerd, zijn alleen toegankelijk voor functies die binnen de klas zijn gedefinieerd. Elk object of elke functie die buiten de klasse is gedefinieerd, heeft geen directe toegang tot dergelijke leden. Een lid van een privéklasse is alleen toegankelijk via de leden- en vriendenfuncties.
Wat is een beschermde klasse?
Leden van de klas die als beschermd zijn gemarkeerd, hebben een voordeel ten opzichte van degenen die als privé zijn gemarkeerd. Ze zijn toegankelijk voor functies binnen de klasse van hun definitie. Bovendien zijn ze toegankelijk vanuit afgeleide klassen.
Voorbeeld 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:
Hier is een screenshot van de code:
Code Verklaring:
- Neem het iostream-headerbestand op in onze code om de functies ervan te gebruiken.
- Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
- Maak een klasse met de naam ClassA.
- Gebruik de modifier voor openbare toegang om het te maken klasselid als openbaar toegankelijk te markeren.
- Maak de functie met de naam set_a() waaraan één gehele waarde val moet doorgegeven worden.
- Maak een functie met de naam get_a().
- Gebruik de privétoegangsmodifier om het klasselid dat moet worden aangemaakt als privé toegankelijk te markeren.
- Declareer een geheel getalvariabele met de naam a.
- Einde van het klassenlichaam.
- Gebruik de klassenaam en de scope resolution operator om toegang te krijgen tot de functie get_a(). We willen definiëren wat de functie doet wanneer deze wordt aangeroepen.
- De functie get_a() moet de waarde van variabele a retourneren wanneer deze wordt aangeroepen.
- Einde van de definitie van de functie get_a().
- Gebruik de klassenaam en de scope resolution operator om toegang te krijgen tot de functie set_a(). We willen definiëren wat de functie doet wanneer deze wordt aangeroepen.
- De waarde van de variabele val toewijzen aan variabele a.
- Einde van de definitie van de functie set_a().
- Roep de functie main() aan. De programmalogica moet worden toegevoegd aan de hoofdtekst van deze functie.
- Maak een instantie van ClassA en geef deze de naam a.
- Gebruik de bovenstaande klasse-instantie en de functie set_a() om een waarde van 20 toe te kennen aan de variabele a.
- Een stukje tekst afdrukken naast de waarde van variabele a op de console. De waarde van variabele a wordt verkregen door de functie get_a() aan te roepen.
- Het programma moet waarde retourneren na succesvolle voltooiing.
- Einde van de hoofdtekst van de functie main().
Voorbeeld 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:
Hier is een screenshot van de code:
Code Verklaring:
- Neem het iostream-headerbestand op in onze code om de functies ervan te gebruiken.
- Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
- Maak een klasse met de naam ParentClass.
- Gebruik de beschermde toegangsmodifier om het aan te maken klasselid als beschermd te markeren.
- Maak een geheel getalvariabele met de naam waarde.
- Einde van het klassenlichaam.
- Maak een nieuwe klasse met de naam ChildClass die de ParentClass erft.
- Gebruik de beschermde toegangsmodifier om het te maken klaslid te markeren als toegankelijk voor onderliggende klassen.
- Maak de functie met de naam setId() waaraan één geheel getal x moet doorgegeven worden.
- De waarde van de variabele x toewijzen aan de variabelewaarde.
- Einde van de definitie van de functie setId().
- Maak een functie met de naam displayValue().
- Druk de waarde van de variabele met de naam waarde af op de console naast andere tekst.
- Einde van de hoofdtekst van de functie displayValue().
- Einde van de hoofdtekst van de klasse ChildClass.
- Roep de functie main() aan. De programmalogica moet worden toegevoegd aan de hoofdtekst van deze functie.
- Maak een instantie van ChildClass en geef deze de naam c.
- Gebruik de bovenstaande klasse-instantie en de functie setId() om een waarde van 21 toe te wijzen aan de variabele x.
- Gebruik de bovenstaande klasse-instantie om de functie displayValue() aan te roepen.
- Het programma moet waarde retourneren na succesvolle voltooiing.
- Einde van de hoofdtekst van de functie main().
Functies van klasseleden
Functies helpen ons gegevens te manipuleren. Functies van klasseleden kunnen op twee manieren worden gedefinieerd:
- Binnen de klassedefinitie
- Buiten de klassedefinitie
Als een functie buiten een klassedefinitie moet worden gedefinieerd, moeten we de scope resolution operator (::) gebruiken. Deze moet worden vergezeld door de klasse- en functienamen.
Voorbeeld 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:
Hier is een screenshot van de code:
Code Verklaring:
- Neem het iostream-headerbestand op in ons programma om de functies ervan te gebruiken.
- Neem het string-headerbestand op in ons programma om de functies ervan te gebruiken.
- Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
- Maak een klasse met de naam Guru99.
- Gebruik de modifier voor openbare toegang om de klasleden die we gaan maken als openbaar toegankelijk te markeren.
- Maak een tekenreeksvariabele met de naam tutorial_name.
- Maak een geheel getalvariabele met de naam id.
- Maak een functie met de naam printname(). Deze functie is niet gedefinieerd binnen de klassedefinitie.
- Maak een functie met de naam print(). Deze functie wordt gedefinieerd binnen de klassedefinitie. Het lichaam ervan is toegevoegd binnen de klassendefinitie.
- Druk de waarde van de variabele-ID af naast andere tekst op de console. Merk op dat dit is toegevoegd in de hoofdtekst van de printid()-functie. Het wordt alleen uitgevoerd als de functie printid() wordt aangeroepen.
- Einde van de hoofdtekst van de functie printid().
- Einde van het lichaam van de klasse Guru99.
- Het begin van de definitie van de functie printnaam().
- Druk de waarde van de variabele tutorial_name af op de console naast andere tekst. Merk op dat dit is toegevoegd in de hoofdtekst van de functie printname(). Het wordt alleen uitgevoerd als de functie printname() wordt aangeroepen.
- Einde van de definitie van de functie printname().
- Roep de functie main() aan. De programmalogica moet worden toegevoegd aan de hoofdtekst van deze functie.
- Maak een instantie van klasse Guru99 en geef deze de naam guru99.
- Gebruik de bovenstaande instantie om een waarde toe te wijzen van C++ aan de variabele tutorial_name.
- Gebruik de instantie guru99 om een waarde van 1001 toe te wijzen aan de variabele-ID.
- Gebruik de instantie guru99 om de functie printname() aan te roepen.
- Roep de opdracht end (eindregel) op om een nieuwe lege regel op de console af te drukken.
- Gebruik de instantie guru99 om de functie printid() aan te roepen.
- Het programma moet waarde retourneren na succesvolle voltooiing.
- Einde van de hoofdtekst van de functie main().
Constructeurs en vernietigers
Wat zijn constructeurs?
Constructen zijn speciale functies die objecten initialiseren. De C++ samenstellers roept een constructor aan bij het maken van een object. De constructors helpen bij het toewijzen van waarden aan klassenleden. Dit gebeurt uiteraard nadat er wat geheugenruimte aan hen is toegewezen.
Wat is Destructors?
Destructors helpen daarentegen klasseobjecten te vernietigen.
De constructornaam moet vergelijkbaar zijn met de klassenaam. Constructors hebben geen retourtype.
De constructor kan binnen of buiten de class body worden gedefinieerd. Als deze buiten de class body wordt gedefinieerd, moet deze worden gedefinieerd met de class name en de scope resolution operator (::).
Voorbeeld 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:
Hier is een screenshot van de code:
Code Verklaring:
- Neem het iostream-headerbestand op in de code om de functies ervan te gebruiken.
- Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
- Maak een klasse met de naam ClassA.
- Gebruik de modifier voor openbare toegang om het lid dat we gaan maken als openbaar toegankelijk te markeren.
- Maak een constructor voor de klasse.
- Tekst die op de console moet worden afgedrukt wanneer de constructor wordt aangeroepen. Het einde is een C++ trefwoord, wat eindregel betekent. Het verplaatst de muiscursor naar de volgende regel.
- Einde van de hoofdtekst van de klassenconstructor.
- Maak een destructor voor de klas.
- Tekst die op de console moet worden afgedrukt wanneer de destructor wordt aangeroepen. Het einde is een C++ trefwoord, wat eindregel betekent. Het verplaatst de muiscursor naar de volgende regel.
- Einde van het lichaam van de destructor.
- Einde van het klassenlichaam.
- Roep de functie main() aan. De programmalogica moet worden toegevoegd aan de hoofdtekst van deze functie.
- Maak een klasseobject en geef het de naam a. De constructeur wordt gebeld.
- Maak een geheel getalvariabele met de naam p en wijs deze de waarde 1 toe.
- Maak een if-instructieblok met behulp van de variabele p.
- Maak een klasseobject en geef het de naam b. De vernietiger zal worden gebeld.
- Einde van de hoofdtekst van de if-instructie.
- Einde van de hoofdtekst van de functie main().
Samenvatting
- C++ is objectgeoriënteerd.
- Klassen vormen de belangrijkste kenmerken van C++ waardoor het objectgeoriënteerd is.
- A C++ klasse combineert gegevens en methoden voor het manipuleren van de gegevens in één.
- Een klasse is een blauwdruk voor een object.
- Klassen bepalen de vorm van een object.
- De gegevens en methoden in een klasse worden klasseleden genoemd.
- Om toegang te krijgen tot klasleden, moet u een exemplaar van de klas gebruiken.
- Om een klasse aan te maken, gebruiken we het trefwoord class.
- De functies van klasseleden kunnen binnen of buiten een klasse worden gedefinieerd.