classes objects c
En kort introduksjon til klasser og gjenstander i C ++.
Klasser og objekter er byggesteinene i Objektorientert programmering i C ++. Hver enhet, levende eller ikke-levende, kan representeres som et objekt og programmeres deretter ved hjelp av C ++. Dermed kan enheter som bil, pult, person, fugl, dyr osv. Bli representert som gjenstander.
Klasse er et nivå høyere enn objektet og representerer kategorien av objekter. Dermed fungerer klassen som en tegning som skisserer objektets design og detaljer. Dette inkluderer data som brukes til å beskrive objektet og forskjellige metoder eller funksjoner som kan påvirke objektdataene.
=> Se opp den enkle C ++ treningsserien her.
I denne opplæringen diskuterer vi alle detaljene i klasse og objekter i C ++ sammen med deres programmatiske representasjon.
Hva du vil lære:
- Klasser
- Objekter
- Tilgangsspesifikatorer
- Konstruktører
- Typer konstruksjoner
- Oppdragsoperatør
- Destroyers
- 'Denne' pekeren
- Konklusjon
- Anbefalt lesing
Klasser
En klasse i C ++ kan sees på som en tegning eller et skjelett av en bestemt enhet. Klasse er en brukerdefinert datatype. Den inneholder generell informasjon eller data for den bestemte enheten og funksjonene som fungerer på den enheten.
I C ++ syntaks definerer vi en klasse med nøkkelordet 'klasse' etterfulgt av navnet på klassen.
Klassenavnet blir fulgt av detaljene i klassen som er omsluttet av krøllete bukseseler og blir avsluttet med et semikolon.
Følgende blokk viser den generelle syntaksen for klassedefinisjonen.
Som vist i representasjonen ovenfor, kan klassen ha tilgangsspesifikatorer som offentlig / beskyttet / privat. Den kan ha datamedlemmer og medlemsfunksjoner. Dataene og funksjonene kalles som medlemmer av klassen. Som standard er medlemmene private for klassen, slik at ingen utenforstående enhet har tilgang til disse medlemmene.
For eksempel, et kjøretøy kan være en generalisert klasse som har egenskaper som en modell, farge, chassisnummer, gjennomsnittlig hastighet osv. Det kan ha funksjoner som changeModel, akselerere, nedgang osv. som utfører handlinger på data-medlemmene. Vi kan definere en klasse med navnet “kjøretøy” som vil ha alle disse datamedlemmene og funksjonene.
Som allerede nevnt er en klasse bare en blåkopi for enhetene. Det tar ikke plass i minnet når det er definert. For at en klasse skal være funksjonell, må vi definere objekter som kan gjøre bruk av medlemmene i klassen.
Objekter
For å kunne bruke klassefunksjonaliteten, må vi instantiere klassen for å lage et objekt. Et objekt er en forekomst av en klasse. Jeg enkle ord, vi kan si at et objekt er en variabel av typeklasse.
Den generelle syntaksen for å lage et objekt er:
classname object_name;
Når objektet er opprettet, kan det brukes til å få tilgang til datamedlemmene og funksjonene til den klassen.
Tilgang til medlemmene i klassen (data og funksjoner) gjøres ved å bruke dot (.) -Operatøren, som også kalles medlemstilgangsoperatøren.
Hvis obj er navnet på objektet og det er en funksjon “display ()” i klassen, kan du få tilgang til funksjonen som “obj.display ()”.
Imidlertid er det en fangst i utsagnet ovenfor. Vi kan få tilgang til funksjonsskjermen () ved hjelp av et objekt og prikkoperatøren hvis funksjonen er 'offentlig'.
Tilgangsspesifikatorer
I C ++ avhenger tilgang av datamedlemmene og funksjonene i klassen av tilgangen til det bestemte datamedlemmet eller funksjonen ved hjelp av en tilgangsspesifikator.
C ++ støtter følgende tilgangsspesifikatorer:
# 1) Privat
Dette er standard tilgangsspesifikator for en klasse i C ++. Dette betyr at hvis det ikke er spesifisert noen tilgangsspesifikator for medlemmene i en klasse, blir den ansett som privat.
Når et medlem er privat, kan det ikke nås utenfor klassen. Ikke engang å bruke objektet og prikkoperatøren. De private datamedlemmene er bare tilgjengelige ved bruk av medlemsfunksjonene i klassen.
hvordan du sletter et element fra en array-java
Imidlertid er det et unntak fra denne regelen, som vi vil diskutere i våre senere emner.
# 2) Offentlig
Et datamedlem eller funksjon som er definert som offentlig i klassen, er tilgjengelig for alle utenfor klassen. Disse medlemmene er tilgjengelige ved hjelp av objektet og prikkoperatøren.
# 3) Beskyttet
Et beskyttet medlem av en klasse er tilgjengelig for selve klassen og barneklassene i den klassen.
Denne tilgangsspesifikatoren brukes spesielt i tilfelle arv, og vi vil diskutere dette i detalj mens vi diskuterer arvemnet.
La oss ta følgende eksempel for å bedre forstå disse tilgangsspesifikasjonene.
#include #include using namespace std; class ABC{ int var1 = 10; public: string name; void display() { cout<<'var1 ='< Produksjon:
var1 = 10
navn = sth
I dette programmet har vi to datamedlemmer der var1 av typen int er privat (tilgangsspesifikator ikke spesifisert. Standard er privat). Et annet medlem er strengnavnet, som blir erklært offentlig. Vi har enda en funksjonsskjerm som viser verdien til begge disse medlemmene.
I hovedfunksjonen erklærer vi et objekt abc av klasse ABC. Deretter setter vi verdier til datamedlemmer og også samtalefunksjonens display ved hjelp av objektet ‘abc’.
Imidlertid når kompilatoren møter linjen abc.var1 = 20; det vil generere en feil om at “var1 er privat variabel”.
Dette er fordi vi ikke får tilgang til private datamedlemmer i en klasse utenfor klassen. Dermed er det en feil. Men vi kan få tilgang til den inne i funksjonen, og derfor når vi sender verdien til var1 i skjermfunksjonen; det kaster ingen feil.
Derfor viser utdataene til programmet den opprinnelige verdien som var1 er deklarert med.
Så langt har vi sett detaljene om klasser, objekter og tilgangsspesifikatorer. La oss nå ta opp et komplett eksempel på en prøveklasselever. Denne klassen har datamedlemmer: student_id, student_name og student_age. Den har også medlemsfunksjoner for å lese studentinformasjon og vise studentinformasjon.
For å gjøre det enkelt for leserne, har vi erklært alle medlemmene i klassen som offentlige.
Følgende program viser fullstendig implementering.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; void read_studentInfo(); void print_studentInfo() { cout<<'
Student ID : '<student_id; cout<>student_name; cout<>student_age; } int main() { student s1; s1.read_studentInfo(); s1.print_studentInfo(); }
Produksjon:
Skriv inn student-ID: 1
Skriv inn studentnavn: abc
Skriv inn student_alder: 12
Student-ID: 1
Elevens navn: abc
Studentalder: 12
Dermed har vi en komplett klasse definert ovenfor. Den eneste bemerkelsesverdige forskjellen er at vi har definert en funksjon “print_studentInfo” inne i klassen, mens en annen funksjon “read_studentinfo” er definert utenfor klassen. Dette er de to måtene som medlemsfunksjoner kan defineres for en klasse.
Merk at funksjonen som er definert utenfor fortsatt har en erklæring / prototype inne i klassen. Det er også definert utenfor klassen ved hjelp av omfangsoppløsningsoperatør (: :) . Så i hovedfunksjonen lager vi et studentklasseobjekt og deretter kaller vi funksjoner for å lese og vise dataene.
Konstruktører
Så langt i denne opplæringen har vi opprettet et enkelt objekt, og deretter tildeler vi verdier til hvert datamedlem i klassen i hovedfunksjonen etter å ha lest disse verdiene fra standardinngangen.
I dette emnet vil vi se på en spesiell funksjon som brukes til å initialisere objektet under opprettelsen. Denne spesielle funksjonen kalles en konstruktør.
En konstruktør er en medlemsfunksjon i klassen, men den skiller seg fra normal medlemsfunksjon på følgende måter:
- Konstruktøren har ingen returverdi, dvs. konstruktøren returnerer aldri en verdi.
- Det er en offentlig medlemsfunksjon i klassen.
- Den brukes til å initialisere datamedlemmene og konstruere objektet til klassen.
- Det kalles automatisk av kompilatoren når objektet blir opprettet.
Typer konstruksjoner
C ++ støtter følgende typer konstruktører.
# 1) Standardkonstruktør
En standardkonstruktør er den grunnleggende konstruktøren og har ingen parametere. Vi kan lage et enkelt objekt uten parametere ved hjelp av standardkonstruktøren.
Standardkonstruktør har følgende syntaks:
classname() { //constructor code }
Hvis en klasse ikke har en standardkonstruktør, lager kompilatoren den.
# 2) Parameterisert konstruktør
En parameterisert konstruktør er en som har en parameterliste der vi kan initialisere klassemedlemmene. Når vi deklarerer et objekt i en parameterisert konstruktør, må vi sende innledende verdier til konstruktorfunksjonen som parametere.
hvordan åpner du en xml-fil
En parameterisert konstruktorfunksjon ser ut som vist nedenfor.
classname(argument list){ //constructor code }
En parameterisert konstruktør brukes til å overbelaste konstruktører. Vi vil se mer om overbelastning i våre senere emner.
En parameterisert konstruktør brukes til å initialisere dataelementene til forskjellige objekter. Mens vi gjør det, kan vi overføre forskjellige verdier av datamedlemmer til forskjellige objekter.
# 3) Kopibyggere
C ++ støtter en tredje type konstruktør kjent som Copy constructor. Dens generelle form er
classname (const classname & obj);
Som vist i erklæringen ovenfor, blir det i kopikonstruktøren opprettet et nytt objekt ved hjelp av verdiene til et annet objekt i samme klasse. Parameteren som sendes til konstruktøren er den konstante referansen til et objekt hvis verdier vil bli brukt for konstruksjonen av det nye objektet.
En kopikonstruktør kalles vanligvis i følgende situasjoner:
- Når et klasseobjekt returneres etter verdi.
- Når et objekt sendes til en funksjon som et argument og blir gitt etter verdi.
- Når et objekt er konstruert fra et annet objekt i samme klasse.
- Når et midlertidig objekt genereres av kompilatoren.
Vi kan imidlertid ikke garantere at kopikonstruktøren sikkert vil bli kalt i alle de ovennevnte tilfellene, da C ++ - kompilator har en måte å optimalisere kopieringsoperasjoner på.
En kopikonstruktør utfører kopiering mellom objektene. Akkurat som standardkonstruktør oppretter C ++ - kompilator en standard kopikonstruktør hvis vi ikke gir en i programmet vårt. Men når en klasse har bestemte datamedlemmer som pekere, referanser eller en hvilken som helst kjøretidsallokering av ressurser, må vi ha vår egen brukerdefinerte kopikonstruktør.
Årsaken er at standard kopikonstruktør bare utfører en grunne kopi av datamedlemmer, dvs. at begge objektene vil dele samme minneplassering. Dette er greit for enkle ikke-peker-datamedlemmer.
Imidlertid, når det gjelder pekere eller andre dynamiske datamedlemmer, vil vi at dataene blir pekt på et nytt minneplassering. Dette er den dype kopien og kan bare oppnås ved hjelp av en brukerdefinert kopikonstruktør.
Nedenfor er et komplett C ++ - program som implementerer alle tre typene konstruktører og deres bruk i å konstruere et objekt.
#include #include using namespace std; class student{ public: int student_id; string student_name; int student_age; //default constructor student(){ student_id = 1; student_name = 'abc'; student_age = 10; } //parameterized constructor student(int id,string name,int age){ student_id = id; student_name = name; student_age = age; } //copy constructor student(const student& st){ student_id = st.student_id; student_name = st.student_name; student_age = st.student_age; } void print_studentInfo() { cout<<'
Student ID : '< Produksjon:
********** s **********
Student-ID: 1
Elevens navn: abc
Studentalder: 10
********** s2 **********
Student-ID: 2
Elevens navn: xyz
Studentalder: 12
Skjermbildet for det samme er gitt nedenfor.
I dette programmet har vi definert en klasselev som ligner på en som ble definert i forrige program. Forskjellen er at i stedet for å lese dataelementverdier fra standardinngang gjennom en funksjon, definerer vi tre konstruktører.
Det er absolutt mulig for en klasse å ha mer enn en konstruktør. Vi har en standardkonstruktør som initialiserer datamedlemmene til startverdiene. Deretter definerer vi en parameterisert konstruktør som sender innledende verdier som parametere til konstruktøren.
Deretter definerer vi en kopikonstruktør som vi sender en konstant referanse til et objekt fra studentklassen.
I hovedfunksjonen lager vi tre objekter hver for seg ved hjelp av tre konstruktører. Første objekt s opprettes ved hjelp av standardkonstruktøren. Det andre objektet s1 opprettes ved hjelp av den parameteriserte konstruktøren mens det tredje objektet s2 opprettes ved hjelp av en kopikonstruktør.
Legg merke til opprettelsen av det tredje objektet s2. Her tilordner vi det allerede opprettede objektet s1 til det nye objektet s2. Dermed når vi konstruerer et nytt objekt ved hjelp av det allerede eksisterende objektet, kalles en kopikonstruktør av kompilatoren.
Oppdragsoperatør
Vi kan også tilordne verdiene til ett objekt til et annet ved hjelp av en tildelingsoperator (=). I dette tilfellet vil vi ha en uttalelse som s1 = s.
Forskjellen mellom kopikonstruktør og tildelingsoperatør er at mens kopikonstruktøren helt konstruerer et nytt objekt, tilordner oppdragsoperatøren bare verdiene til et medlem av objektet på RHS til det til objektet på LHS. Dette betyr at gjenstandene på begge sidene til en oppdragsoperatør må være eksisterende før oppdraget.
Destroyers
En destruktør er også en spesiell funksjon som en konstruktør, men den implementerer funksjonaliteten som er nøyaktig motsatt av konstruktøren. Mens konstruktør brukes til å lage et objekt, brukes en destruktør til å ødelegge eller slette et objekt.
Noen av egenskapene til ødeleggeren inkluderer:
beste gratis mp3 nedlasting for android
- Et destruktørnavn er det samme som klassenavnet, men begynner med et tilde (~) tegn.
- Destructor har ingen returtype.
- En ødelegger har ingen argumenter.
- Det kan bare være en ødelegger i en klasse.
- Kompilatoren oppretter alltid en standarddestruktør hvis vi ikke klarer å tilby en for en klasse.
Den generelle syntaksen til en destruktør er:
~classname(){ //cleanup code }
Destruktøren til en klasse kalles vanligvis i følgende situasjoner:
- Når objektet går utenfor omfanget, kalles klassedestruktøren automatisk.
- På samme måte kalles destruktoren når programmet er ferdig med utførelsen. Dette betyr at alle gjenstander også slutter å eksistere. Derfor vil ødeleggeren av hvert objekt kalles.
- Klassens destruktør kalles også når 'slett' operatøren for å slette et objekt blir utført.
- Vi kan også ringe destruktøren eksplisitt for å utføre oppryddingsaktiviteter etter at vi er ferdige med objektfunksjonaliteten.
Eksemplet nedenfor viser hvordan en ødelegger fungerer.
#include using namespace std; class sample{ public: sample(){ cout<<'Constructor::sample called'< Produksjon:
Konstruktør :: prøve kalt
Dette er prøveklasse
Destructor :: ~ prøve kalt
Skjermbildet for ovennevnte utdata er gitt nedenfor.
Vi har definert et klasseprøve der vi har definert en konstruktør, en destruktor og en funksjonsvisning. I hovedfunksjonen lager vi et objekt obj av klasseeksempel og kaller deretter visningsfunksjonen på dette objektet.
Etter det utføres en retur 0. I utgangen kan vi se at øyeblikket når skjermfunksjonen returnerer og programkontrollen kommer til setning retur 0, blir destruktoren utført. Dette betyr at den blir utført i det øyeblikket objektet går utenfor omfanget.
'Denne' pekeren
C ++ bruker et spesielt konsept relatert til objektene, som er kjent som 'denne' pekeren. 'Denne' pekeren peker alltid på gjeldende objekt. Avhengig av situasjonen, bruker vi 'denne' pekeren når vi skal referere til det nåværende objektet.
Vi vet at hver gang en forekomst av klassen, dvs. et objekt, opprettes, blir det laget en egen kopi av datamedlemmene i klassen for objektet. Men når det gjelder medlemsfunksjonene i klassen, deler alle objekter den samme kopien.
Så når et eller flere objekter får tilgang til medlemsfunksjonene samtidig, hvordan kan vi sikre at riktige datamedlemmer er tilgjengelig og endres av medlemsfunksjonene?
Dette er stedet der 'denne' pekeren kommer til handling. Kompilatoren sender en implisitt peker med funksjonsnavnet som 'dette'. Dette kalles 'denne' pekeren.
'Denne' pekeren sendes som et skjult argument til alle medlemsfunksjonsanropene. Det er vanligvis en lokal variabel. Derfor er 'denne' pekeren en konstant peker, og innholdet er minneadressen til det gjeldende objektet.
Merk at denne pekeren bare er tilgjengelig for ikke-statiske medlemsfunksjoner og ikke for statiske funksjoner. Dette er fordi de statiske funksjonene ikke trenger å få tilgang til med et objekt. De kan nås direkte ved hjelp av kursnavnet.
Vi bruker vanligvis 'denne' pekeren i situasjoner der medlemsvariablene og parametrene sendes for å initialisere medlemsvariablene som har samme navn. Vi bruker den også når vi trenger å returnere gjeldende objekt fra funksjonen.
La oss se demonstrasjonen av 'denne' pekeren nedenfor.
#include using namespace std; class Sample { private: int num; char ch; public: Sample &setParam(int num, char ch){ this->num =num; this->ch = ch; return *this; } void printValues(){ cout<<'num = '< Produksjon:
num = 100
ch = A.
I det ovennevnte programmet har vi en klasse som heter Sample, med to data-medlemmers num og ch. Vi har en medlemsfunksjon setParam som sender parametrene med samme navn, num og ch for å sette verdiene til medlemsvariablene.
Inne i funksjonen tildeler vi disse verdiene til de gjeldende objektmedlemvariablene som er indikert av denne pekeren. Når verdiene er satt, returneres det nåværende objektet “dette” fra funksjonen.
I hovedfunksjonen oppretter vi først et objekt av prøveklasse, obj og kaller en setParam-funksjon for å sette verdiene og deretter kaller funksjonen printValues for å skrive ut verdiene.
Konklusjon
Vi har lært de grunnleggende byggesteinene til OOP i C ++ i denne opplæringen. Å forstå klassene og objektene er de viktigste kravene, til å begynne med, OOP i C ++. Vi har også lært om konstruktørene og destruktørene i detalj med eksempler.
I vår kommende opplæring vil vi lære om initialiseringslistene i C ++.
=> Se opp den enkle C ++ treningsserien her.
Anbefalt lesing
- Python OOP-konsepter (Python-klasser, gjenstander og arv)
- Java-grensesnitt og abstrakt klasseopplæring med eksempler
- Arbeide med VBScript Excel Objects
- QTP Tutorial # 7 - QTP’s Object Identification Paradigm - How QTP Identify Objects Uniqueely?
- Object Repository in QTP - Tutorial # 22
- Arbeider med VBScript ADODB Connection Objects
- Runtime Polymorphism In C ++
- Arv i C ++