classes objects c
Een korte inleiding tot klassen en objecten in C ++.
Klassen en objecten zijn de bouwstenen van objectgeoriënteerd programmeren in C ++. Elke entiteit, levend of niet-levend, kan worden weergegeven als een object en dienovereenkomstig worden geprogrammeerd met C ++. Zo kunnen entiteiten zoals een auto, bureau, persoon, vogel, dier, etc. worden weergegeven als objecten.
Klasse is een niveau hoger dan het object en vertegenwoordigt de categorie objecten. Klasse fungeert dus als een blauwdruk die het objectontwerp en de details schetst. Dit omvat gegevens die worden gebruikt om het object te beschrijven en verschillende methoden of functies die op de objectgegevens kunnen werken.
Bekijk hier de eenvoudige C ++ trainingsserie.
In deze tutorial bespreken we alle details van klassen en objecten in C ++, samen met hun programmatische weergave.
Wat je leert:
- Klassen
- Voorwerpen
- Toegang tot Specifiers
- Constructeurs
- Soorten constructeurs
- Toewijzing Operator
- Vernietigers
- 'Deze' aanwijzer
- Gevolgtrekking
- Aanbevolen literatuur
Klassen
Een klasse in C ++ kan worden gezien als een blauwdruk of een skelet van een bepaalde entiteit. Klasse is een door de gebruiker gedefinieerd gegevenstype. Het bevat de algemene informatie of gegevens voor die specifieke entiteit en de functies die op die entiteit werken.
In de C ++ syntaxis definiëren we een klasse met het trefwoord 'class' gevolgd door de naam van de klasse.
De klassenaam wordt gevolgd door de details van de klasse tussen accolades en wordt afgesloten met een puntkomma.
Het volgende blok toont de algemene syntaxis voor de klassendefinitie.
Zoals getoond in de bovenstaande weergave, kan de klasse toegangsspecificaties hebben zoals public / protected / private. Het kan gegevensleden en lidfuncties hebben. De gegevens en functies worden genoemd als leden van de klas. Standaard zijn de leden privé voor de klas, zodat geen enkele externe entiteit toegang heeft tot deze leden.
Bijvoorbeeld, een voertuig kan een gegeneraliseerde klasse zijn met eigenschappen zoals een model, kleur, chassisnummer, gemiddelde snelheid, etc. Het kan functies hebben zoals changeModel, accelereren, vertragen, etc. die acties uitvoeren op de gegevenselementen. We kunnen een klasse met de naam 'voertuig' definiëren die al deze gegevensleden en functies zal hebben.
Zoals eerder vermeld, is een klasse slechts een blauwdruk voor de entiteiten. Het neemt geen ruimte in het geheugen in wanneer het is gedefinieerd. Om een klasse functioneel te maken, moeten we objecten definiëren die gebruik kunnen maken van de leden van de klasse.
Voorwerpen
Om de klassefunctionaliteit te gebruiken, moeten we de klasse instantiëren om een object te maken. Een object is een instantie van een klasse. In simpele woorden kunnen we zeggen dat een object een variabele is van het type class.
De algemene syntaxis om een object te maken is:
Nadat het object is gemaakt, kan het worden gebruikt om toegang te krijgen tot de gegevensleden en functies van die klasse.
Toegang krijgen tot de leden van de klasse (gegevens en functies) gebeurt met behulp van de puntoperator (.), Ook wel de operator voor ledentoegang genoemd.
Als obj de naam van het object is en er is een functie 'display ()' in de klasse, dan is de functie toegankelijk als 'obj.display ()'.
Er zit echter een addertje onder het gras in de bovenstaande verklaring. We hebben toegang tot de functieweergave () met behulp van een object en de puntoperator als de functie 'openbaar' is.
Toegang tot Specifiers
In C ++ is de toegang tot de gegevensleden en functies in de klasse afhankelijk van de toegang die wordt gegeven aan dat specifieke gegevenslid of die functie met behulp van een toegangsspecificatie.
C ++ ondersteunt de volgende toegangsspecificaties:
# 1) Privé
Dit is de standaardtoegangsspecificatie voor een klasse in C ++. Dit betekent dat als er geen toegangsspecificatie is opgegeven voor de leden in een klas, deze als privé wordt beschouwd.
Als een lid privé is, kan het niet buiten de klas worden geopend. Zelfs het object en de puntoperator niet gebruiken. De leden van de privégegevens zijn alleen toegankelijk via de lidfuncties van de klas.
selenium interviewvragen en antwoorden voor 4 jaar ervaring
Er is echter een uitzondering op deze regel, die we in onze latere onderwerpen zullen bespreken.
# 2) Openbaar
Een gegevenslid of functie die in de klas als openbaar is gedefinieerd, is voor iedereen buiten de klas toegankelijk. Deze leden zijn toegankelijk via het object en de puntoperator.
# 3) Beschermd
Een beschermd lid van een klas is toegankelijk voor de klas zelf en de onderliggende klassen van die klas.
Deze toegangsspecificatie wordt vooral gebruikt in het geval van overerving en we zullen dit in detail bespreken tijdens het bespreken van het overervingsonderwerp.
Laten we het volgende voorbeeld nemen om deze toegangsspecificaties beter te begrijpen.
Uitgang:
var1 = 10
naam = sth
In dit programma hebben we twee gegevensleden waarvan var1 van het type int privé is (toegangsspecificatie niet gespecificeerd. Standaard is privé). Een ander lid is de tekenreeksnaam, die als openbaar is gedeclareerd. We hebben nog een andere functiedisplay die de waarde van beide leden weergeeft.
In de hoofdfunctie declareren we een object abc van klasse ABC. Vervolgens stellen we waarden in voor gegevensleden en ook voor de weergave van de oproepfunctie met behulp van object ‘abc’.
Als de compiler echter de regel abc.var1 = 20; het zal een fout genereren dat 'var1 is privé variabele'.
Dit komt omdat we geen toegang hebben tot privégegevens van leden van een klas buiten de klas. Er is dus een fout opgetreden. Maar we hebben er toegang toe binnen de functie en dus als we de waarde van var1 in de weergavefunctie uitvoeren; het genereert geen enkele fout.
Vandaar dat de uitvoer van het programma de initiële waarde toont waarmee var1 wordt gedeclareerd.
Tot dusver hebben we de details over klassen, objecten en toegangsspecificaties gezien, laten we nu een compleet voorbeeld nemen van een voorbeeldklasstudent. Deze klas heeft gegevensleden: student_id, student_name en student_age. Het heeft ook ledenfuncties om studentinformatie te lezen en studentinformatie weer te geven.
Om het de lezers gemakkelijk te maken, hebben we alle leden van de klas openbaar verklaard.
Het volgende programma toont de volledige implementatie.
Uitgang:
Voer de leerling-ID in: 1
Voer student_name: abc in
Voer student_age: 12 in
Student-ID: 1
Student naam: abc
Student Leeftijd: 12
We hebben dus een volledige klasse hierboven gedefinieerd. Het enige opmerkelijke verschil is dat we één functie “print_studentInfo” binnen de klasse hebben gedefinieerd, terwijl de andere functie “read_studentinfo” buiten de klasse is gedefinieerd. Dit zijn de twee manieren waarop lidfuncties voor een klasse kunnen worden gedefinieerd.
Merk op dat de functie die buiten gedefinieerd is, nog steeds een declaratie / prototype binnen de klasse heeft. Het wordt ook buiten de klasse gedefinieerd met behulp van de scope resolutie operator (: :) Vervolgens maken we in de hoofdfunctie een leerlingklasseobject en roepen we functies aan om de gegevens te lezen en weer te geven.
Constructeurs
Tot dusver hebben we in deze tutorial een eenvoudig object gemaakt en vervolgens wijzen we waarden toe aan elk gegevenslid van de klasse in de hoofdfunctie na het lezen van deze waarden uit de standaardinvoer.
In dit onderwerp zullen we een speciale functie bekijken die wordt gebruikt om het object te initialiseren tijdens het maken ervan. Deze speciale functie wordt een constructor genoemd.
Een constructor is een lidfunctie van de klasse, maar verschilt op de volgende manieren van de normale lidfunctie:
- De constructor heeft geen retourwaarde, d.w.z. constructor retourneert nooit een waarde.
- Het is een openbare ledenfunctie van de klas.
- Het wordt gebruikt om de gegevensleden te initialiseren en het object van de klasse te construeren.
- Het wordt automatisch aangeroepen door de compiler wanneer het object wordt gemaakt.
Soorten constructeurs
C ++ ondersteunt de volgende typen constructors.
# 1) Standaard Constructor
Een standaardconstructor is de basisconstructor en heeft geen parameters. We kunnen een eenvoudig object zonder parameters maken met behulp van de standaardconstructor.
De standaardconstructor heeft de volgende syntaxis:
Als een klasse geen standaardconstructor heeft, maakt de compiler deze aan.
# 2) Geparametriseerde constructor
Een constructor met parameters is er een die een parameterlijst heeft waarmee we de klasleden kunnen initialiseren. Als we een object declareren in een constructor met parameters, dan moeten we initiële waarden als parameters doorgeven aan de constructorfunctie.
Een geparametriseerde constructorfunctie ziet eruit zoals hieronder weergegeven.
hoe u een voorbeeld van een bugrapport schrijft
Een constructor met parameters wordt gebruikt om constructors te overbelasten. We zullen meer zien over overbelasting in onze latere onderwerpen.
Een geparametriseerde constructor wordt gebruikt om gegevensleden van verschillende objecten te initialiseren. Terwijl we dit doen, kunnen we verschillende waarden van gegevensleden doorgeven aan verschillende objecten.
# 3) Kopieer constructeurs
C ++ ondersteunt een derde type constructor dat bekend staat als Copy constructor. De algemene vorm is
classname (const classname & obj);
Zoals getoond in de bovenstaande verklaring, wordt in de kopieerconstructor een nieuw object gemaakt met behulp van de waarden van een ander object van dezelfde klasse. De parameter die aan de constructor wordt doorgegeven, is de constante referentie van een object waarvan de waarden zullen worden gebruikt voor de constructie van het nieuwe object.
Een kopieerconstructor wordt meestal aangeroepen in de volgende situaties:
- Wanneer een klasseobject wordt geretourneerd door waarde.
- Wanneer een object als argument aan een functie wordt doorgegeven en als waarde wordt doorgegeven.
- Wanneer een object is opgebouwd uit een ander object van dezelfde klasse.
- Wanneer een tijdelijk object wordt gegenereerd door de compiler.
We kunnen echter niet garanderen dat de kopieerconstructor zeker in alle bovenstaande gevallen zal worden aangeroepen, aangezien de C ++ - compiler een manier heeft om kopieerbewerkingen te optimaliseren.
Een kopieerconstructor voert een ledgewijze kopie uit tussen objecten. Net als de standaard constructor, maakt de C ++ compiler een standaard kopie constructor als we er geen in ons programma hebben. Maar als een klasse bepaalde gegevensleden heeft, zoals verwijzingen, referenties of een willekeurige toewijzing van bronnen tijdens de uitvoering, dan hebben we onze eigen door de gebruiker gedefinieerde kopieerconstructor nodig.
De reden is dat de standaard kopieerconstructor slechts een ondiepe kopie van gegevensleden uitvoert, d.w.z. beide objecten zullen dezelfde geheugenlocatie delen. Dit is prima voor eenvoudige gegevensleden die geen aanwijzer zijn.
Als het echter om verwijzingen of andere dynamische gegevensleden gaat, willen we dat de gegevens naar een nieuwe geheugenlocatie worden verwezen. Dit is de diepe kopie en kan alleen worden bereikt met een door de gebruiker gedefinieerde kopieerconstructor.
Hieronder een compleet C ++ programma dat alle drie de typen constructors implementeert en hun gebruik bij het construeren van een object.
Uitgang:
********** s **********
Student-ID: 1
Student naam: abc
Student Leeftijd: 10
********** s2 **********
Student-ID: 2
Student naam: xyz
Student Leeftijd: 12
Het screenshot voor hetzelfde wordt hieronder gegeven.
In dit programma hebben we een klasstudent gedefinieerd die vergelijkbaar is met degene die in het vorige programma is gedefinieerd. Het verschil is dat in plaats van gegevenslidwaarden te lezen van standaardinvoer via een functie, we drie constructors definiëren.
Het is absoluut mogelijk dat een klasse meer dan één constructor heeft. We hebben een standaardconstructor die de gegevensleden initialiseert naar de beginwaarden. Vervolgens definiëren we een constructor met parameters die initiële waarden als parameters doorgeeft aan de constructor.
Vervolgens definiëren we een kopieerconstructor waaraan we een constante verwijzing naar een object van de leerlingklasse doorgeven.
In de hoofdfunctie maken we drie objecten afzonderlijk met behulp van drie constructors. De eerste objecten worden gemaakt met de standaardconstructor. Het tweede object s1 wordt gemaakt met de constructor met parameters, terwijl het derde object s2 wordt gemaakt met een kopieerconstructor.
Let op de creatie van het derde object s2. Hier wijzen we het reeds gemaakte object s1 toe aan het nieuwe object s2. Dus wanneer we een nieuw object construeren met behulp van het reeds bestaande object, wordt een kopieerconstructor aangeroepen door de compiler.
Toewijzing Operator
We kunnen ook de waarden van het ene object aan het andere toewijzen met behulp van een toewijzingsoperator (=). In dit geval hebben we een statement als s1 = s.
Het verschil tussen kopieerconstructor en toewijzingsoperator is dat terwijl de kopieerconstructor een geheel nieuw object construeert, de toewijzingsoperator alleen de waarden van een lid van het object op RHS toewijst aan die van het object op LHS. Dit betekent dat de objecten aan beide zijden van een toewijzingsoperator aanwezig moeten zijn voorafgaand aan de toewijzing.
Vernietigers
Een destructor is ook een speciale functie zoals een constructor, maar het implementeert de functionaliteit die precies het tegenovergestelde is van de constructor. Terwijl de constructor wordt gebruikt om een object te maken, wordt een destructor gebruikt om een object te vernietigen of te verwijderen.
Enkele van de kenmerken van de destructor zijn:
- De naam van een destructor is hetzelfde als de classname, maar begint met een tilde (~) teken.
- Destructor heeft geen retourtype.
- Een destructor heeft geen argumenten.
- Er kan maar één vernietiger in een klas zijn.
- De compiler maakt altijd een standaard destructor als we er geen voor een klasse kunnen opgeven.
De algemene syntaxis van een destructor is:
De vernietiger van een klasse wordt meestal aangeroepen in de volgende situaties:
beste compiler voor c ++
- Als het object buiten het bereik gaat, wordt automatisch de class destructor aangeroepen.
- Op dezelfde manier wordt de destructor aangeroepen wanneer het programma de uitvoering heeft voltooid. Dit betekent dat ook alle objecten ophouden te bestaan. Daarom wordt de vernietiger van elk object genoemd.
- De destructor van de klasse wordt ook aangeroepen wanneer de ‘delete’ operator om een object te verwijderen wordt uitgevoerd.
- We kunnen de destructor ook expliciet bellen om eventuele opruimactiviteiten uit te voeren nadat we klaar zijn met de objectfunctionaliteit.
Het onderstaande voorbeeld toont de werking van een destructor.
Uitgang:
Constructor :: sample genaamd
Dit is een voorbeeldklasse
Destructor :: ~ sample genaamd
De schermafbeelding voor de bovenstaande uitvoer wordt hieronder weergegeven.
We hebben een klassenvoorbeeld gedefinieerd waarin we een constructor, een destructor en een functieweergave hebben gedefinieerd. In de hoofdfunctie maken we een objectobj van een klassenvoorbeeld en roepen we de weergavefunctie op dit object aan.
Daarna wordt een return 0 uitgevoerd. In de uitvoer kunnen we zien dat op het moment dat de weergavefunctie terugkeert en de programmabesturing naar statement return 0 komt, de destructor wordt uitgevoerd. Dit betekent dat het wordt uitgevoerd op het moment dat het object buiten de scope gaat.
'Deze' aanwijzer
C ++ gebruikt een speciaal concept met betrekking tot de objecten, dat bekend staat als 'deze' pointer. De aanwijzer 'dit' wijst altijd naar het huidige object. Dus afhankelijk van de situatie gebruiken we “deze” aanwijzer wanneer we naar het huidige object moeten verwijzen.
We weten dat elke keer dat een instantie van de klasse, d.w.z. een object, wordt gemaakt, een afzonderlijke kopie van de gegevensleden van de klasse voor het object wordt gemaakt. Maar als het gaat om de lidfuncties van de klasse, delen alle objecten dezelfde kopie.
Dus als een of meer objecten tegelijkertijd toegang hebben tot de lidfuncties, hoe zorgen we er dan voor dat de juiste gegevensleden worden geopend en gewijzigd door de lidfuncties?
Dit is de plaats waar 'deze' wijzer in actie komt. De compiler geeft een impliciete pointer door met de functienaam als 'this'. Dit wordt de 'deze' aanwijzer genoemd.
De aanwijzer “dit” wordt als een verborgen argument doorgegeven aan alle lidfunctie-aanroepen. Het is meestal een lokale variabele. Daarom is 'deze' aanwijzer een constante aanwijzer en de inhoud ervan is het geheugenadres van het huidige object.
Merk op dat deze aanwijzer alleen beschikbaar is voor niet-statische lidfuncties en niet voor statische functies. Dit komt doordat de statische functies niet via een object hoeven te worden benaderd. Ze zijn direct toegankelijk via de klassenaam.
We gebruiken meestal de 'this' pointer in situaties waarin de lidvariabelen en de parameters worden doorgegeven om de lidvariabelen met dezelfde naam te initialiseren. We gebruiken het ook wanneer we het huidige object uit de functie moeten retourneren.
Laten we de demonstratie van 'deze' aanwijzer hieronder bekijken.
Uitgang:
num = 100
ch = A
In het bovenstaande programma hebben we een klasse genaamd Sample, met twee gegevensleden ‘num en ch. We hebben een lidfunctie setParam die de parameters met dezelfde namen, num en ch doorgeeft om de waarden van de lidvariabelen in te stellen.
Binnen de functie wijzen we deze waarden toe aan de huidige objectlidvariabelen die door deze aanwijzer worden aangegeven. Zodra de waarden zijn ingesteld, wordt het huidige object 'this' geretourneerd door de functie.
In de hoofdfunctie maken we eerst een object van Sample class, obj en roepen we een setParam-functie aan om de waarden in te stellen en roepen we vervolgens de functie printValues aan om de waarden af te drukken.
Gevolgtrekking
In deze tutorial hebben we de basisbouwstenen van OOP in C ++ geleerd. Inzicht in de klassen en objecten zijn de primaire vereisten, om te beginnen, OOP in C ++. We hebben ook in detail geleerd over de constructeurs en destructors met voorbeelden.
In onze aanstaande tutorial zullen we leren over de initialisatie-lijsten in C ++.
Bekijk hier de eenvoudige C ++ trainingsserie.
Aanbevolen literatuur
- Python OOPs-concepten (Python-klassen, objecten en overerving)
- Java-interface en abstracte les met voorbeelden
- Werken met VBScript Excel-objecten
- QTP Tutorial # 7 - QTP's Object Identification Paradigma - Hoe QTP objecten uniek identificeert?
- Objectrepository in QTP - Tutorial # 22
- Werken met VBScript ADODB-verbindingsobjecten
- Runtime-polymorfisme in C ++
- Overerving in C ++