classes objects c
En kort introduktion til klasser og objekter i C ++.
Klasser og objekter er byggestenene i Objektorienteret programmering i C ++. Hver enhed, levende eller ikke-levende, kan repræsenteres som et objekt og programmeres i overensstemmelse hermed ved hjælp af C ++. Således kan enheder som en bil, skrivebord, person, fugl, dyr osv. Repræsenteres som objekter.
Klassen er et niveau højere end objektet og repræsenterer kategorien af objekter. Således fungerer klassen som en plan, der skitserer objektets design og detaljer. Dette inkluderer data, der bruges til at beskrive objektet og forskellige metoder eller funktioner, der kan virke på objektdataene.
=> Pas på den enkle C ++ træningsserie her.
I denne vejledning diskuterer vi alle detaljerne i klasse og objekter i C ++ sammen med deres programmatiske repræsentation.
Hvad du vil lære:
- Klasser
- Objekter
- Adgangsspecifikatorer
- Konstruktører
- Typer af konstruktører
- Opdragsoperatør
- Destroyers
- 'Denne' markør
- Konklusion
- Anbefalet læsning
Klasser
En klasse i C ++ kan ses som en tegning eller et skelet af en bestemt enhed. Klassen er en brugerdefineret datatype. Den indeholder de generelle oplysninger eller data for den pågældende enhed og de funktioner, der fungerer på den enhed.
I C ++ syntaks definerer vi en klasse med nøgleordet 'klasse' efterfulgt af navnet på klassen.
Klassens navn efterfølges af detaljerne i klassen, der er lukket i krøllede seler, og afsluttes med et semikolon.
Den følgende blok viser den generelle syntaks for klassedefinitionen.
Som vist i ovenstående repræsentation kan klassen have adgangsspecifikatorer som offentlig / beskyttet / privat. Det kan have datamedlemmer og medlemsfunktioner. Dataene og funktionerne kaldes som medlemmer af klassen. Som standard er medlemmerne private for klassen, så ingen ekstern enhed har adgang til disse medlemmer.
For eksempel, et køretøj kan være en generaliseret klasse med egenskaber som en model, farve, chassisnummer, gennemsnitshastighed osv. Det kan have funktioner som changeModel, accelerere, afmatning osv., der udfører handlinger på data-medlemmerne. Vi kan definere en klasse med navnet 'køretøj', der vil have alle disse datamedlemmer og funktioner.
Som allerede nævnt er en klasse bare en plan for enhederne. Det tager ikke plads i hukommelsen, når den er defineret. For at en klasse skal være funktionel, skal vi definere objekter, der kan gøre brug af klassens medlemmer.
Objekter
For at kunne bruge klassefunktionaliteten er vi nødt til at instantiere klassen for at oprette et objekt. Et objekt er en forekomst af en klasse. Jeg enkle ord, vi kan sige, at et objekt er en variabel af typen klasse.
Den generelle syntaks til oprettelse af et objekt er:
classname object_name;
Når objektet er oprettet, kan det bruges til at få adgang til datakomponenterne og funktionerne i den klasse.
Adgang til medlemmerne af klassen (data og funktioner) sker ved hjælp af dot (.) -Operatøren, som også kaldes medlemadgangsoperatøren.
Hvis obj er navnet på objektet, og der er en funktion 'display ()' i klassen, kan funktionen åbnes som 'obj.display ()'.
Der er dog en fangst i ovenstående erklæring. Vi kan få adgang til funktionsdisplayet () ved hjælp af et objekt og punktoperatoren, hvis funktionen er 'offentlig'.
Adgangsspecifikatorer
I C ++ afhænger adgang til datamedlemmerne og funktionerne i klassen af adgangen til det bestemte datamedlem eller funktion ved hjælp af en adgangsspecifikator.
C ++ understøtter følgende adgangsspecifikatorer:
# 1) Privat
Dette er standardadgangsspecifikatoren for en klasse i C ++. Dette betyder, at hvis der ikke er angivet nogen adgangsspecifikator for medlemmerne i en klasse, betragtes den som privat.
Når et medlem er privat, kan det ikke tilgås uden for klassen. Ikke engang at bruge objektet og prikoperatoren. Der er kun adgang til private datamedlemmer ved hjælp af klassens medlemsfunktioner.
bedste dvd-rippesoftware til mac
Der er dog en undtagelse fra denne regel, som vi vil diskutere i vores senere emner.
# 2) Offentlig
Et datamedlem eller funktion, der er defineret som offentlig i klassen, er tilgængelig for alle uden for klassen. Disse medlemmer kan tilgås ved hjælp af objektet og prikoperatoren.
# 3) Beskyttet
Et beskyttet medlem af en klasse er tilgængeligt for selve klassen og barneklassen i den klasse.
Denne adgangsspecifikator bruges især i tilfælde af arv, og vi vil diskutere dette detaljeret, mens vi diskuterer arveemnet.
Lad os tage følgende eksempel for bedre at forstå disse adgangsspecifikatorer.
#include #include using namespace std; class ABC{ int var1 = 10; public: string name; void display() { cout<<'var1 ='< Produktion:
var1 =10
navn = sth
I dette program har vi to data-medlemmer, hvoraf var1 af typen int er privat (adgangsspecifikator ikke specificeret. Standard er privat). Et andet medlem er strengnavnet, der erklæres offentligt. Vi har endnu en funktionsskærm, der viser værdien af begge disse medlemmer.
I hovedfunktionen erklærer vi et objekt abc af klasse ABC. Derefter indstiller vi værdier til datamedlemmer og også opkaldsfunktionens display ved hjælp af objektet 'abc'.
Når compileren møder linjen abc.var1 = 20; det vil generere en fejl, der “var1 er privat variabel”.
Dette skyldes, at vi ikke kan få adgang til private datamedlemmer i en klasse uden for klassen. Således er der en fejl. Men vi kan få adgang til det inde i funktionen, og derfor når vi udlæser værdien af var1 i displayfunktionen; det kaster ikke nogen fejl.
Derfor viser output fra programmet den indledende værdi, som var1 deklareres med.
Indtil videre har vi set detaljerne om klasser, objekt og adgangsspecifikatorer. Lad os nu tage et komplet eksempel på en prøveklassestudent. Denne klasse har datamedlemmer: student_id, student_name og student_age. Det har også medlemsfunktioner til at læse studentinfo og vise studenterinfo.
For at gøre tingene lette for læserne har vi erklæret alle medlemmer af klassen som offentlige.
Følgende program viser den komplette 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(); }
Produktion:
Indtast elev-id: 1
Indtast elevnavn: abc
Indtast student_alder: 12
Elev-ID: 1
Studerendes navn: abc
Studerendes alder: 12
Således har vi en komplet klasse defineret ovenfor. Den eneste bemærkelsesværdige forskel er, at vi har defineret en funktion “print_studentInfo” inde i klassen, mens anden funktion “read_studentinfo” er defineret uden for klassen. Dette er de to måder, hvorpå medlemsfunktioner kan defineres for en klasse.
Bemærk, at den funktion, der er defineret udenfor, stadig har en erklæring / prototype inde i klassen. Det defineres også uden for klassen ved hjælp af omfangsopløsningsoperator (: :) . Derefter opretter vi et elevobjekt i hovedfunktionen, og derefter kalder vi funktioner til at læse og vise dataene.
Konstruktører
Indtil videre i denne tutorial har vi oprettet et simpelt objekt, og derefter tildeler vi værdier til hvert datamedlem i klassen i hovedfunktionen efter at have læst disse værdier fra standardindgangen.
I dette emne vil vi se på en speciel funktion, der bruges til at initialisere objektet under dets oprettelse. Denne specielle funktion kaldes en konstruktør.
En konstruktør er en medlemsfunktion i klassen, men den adskiller sig fra den normale medlemsfunktion på følgende måder:
- Konstruktøren har ingen returværdi, dvs. konstruktøren returnerer aldrig en værdi.
- Det er en offentlig medlemsfunktion i klassen.
- Det bruges til at initialisere datamedlemmerne og konstruere klassens objekt.
- Det kaldes automatisk af compileren, når objektet oprettes.
Typer af konstruktører
C ++ understøtter følgende typer konstruktører.
# 1) Standardkonstruktør
En standardkonstruktør er den grundlæggende konstruktør og har ingen parametre. Vi kan oprette et simpelt objekt uden nogen parametre ved hjælp af standardkonstruktøren.
Standardkonstruktør har følgende syntaks:
c # interviewspørgsmål til erfarne
classname() { //constructor code }
Hvis en klasse ikke har en standardkonstruktør, opretter kompilatoren den.
# 2) Parametreret konstruktør
En parameteriseret konstruktør er en, der har en parameterliste, hvor vi kan initialisere klassemedlemmerne. Når vi erklærer et objekt i en parameteriseret konstruktør, skal vi sende initialværdier til konstruktorfunktionen som parametre.
En parametreret konstruktorfunktion ser ud som vist nedenfor.
classname(argument list){ //constructor code }
En parameteriseret konstruktør bruges til at overbelaste konstruktører. Vi vil se mere om overbelastning i vores senere emner.
En parametreret konstruktør bruges til at initialisere dataelementer for forskellige objekter. Mens vi gør det, kan vi videregive forskellige værdier af datamedlemmer til forskellige objekter.
# 3) Kopi konstruktører
C ++ understøtter en tredje type konstruktør kendt som Copy constructor. Dens generelle form er
klassenavn (const klassenavn & obj);
Som vist i ovenstående erklæring oprettes der i et kopi-konstruktør et nyt objekt ved hjælp af værdierne for et andet objekt i samme klasse. Parameteren, der sendes til konstruktøren, er den konstante reference for et objekt, hvis værdier vil blive brugt til konstruktionen af det nye objekt.
En kopibygger kaldes normalt i følgende situationer:
- Når et klasseobjekt returneres efter værdi.
- Når et objekt sendes til en funktion som et argument og sendes med værdi.
- Når et objekt er konstrueret fra et andet objekt i samme klasse.
- Når et midlertidigt objekt genereres af compileren.
Vi kan dog ikke garantere, at kopikonstruktør helt sikkert kaldes i alle ovennævnte tilfælde, da C ++ - kompilator har en måde at optimere kopifunktioner på.
En kopikonstruktør udfører kopi mellem medlemmerne mellem objekter. Ligesom standardkonstruktør opretter C ++ - kompilator en standardkopiekonstruktør, hvis vi ikke leverer en i vores program. Men når en klasse har bestemte datamedlemmer som markører, referencer eller en hvilken som helst runtime-tildeling af ressourcer, skal vi have vores egen brugerdefinerede kopikonstruktør.
Årsagen er, at standardkopiekonstruktøren kun udfører en lav kopi af datamedlemmer, dvs. begge objekter deler den samme hukommelsesplacering. Dette er fint for enkle ikke-pointer-datamedlemmer.
Men når det kommer til markører eller andre dynamiske datamedlemmer, vil vi gerne have, at dataene peges på en ny hukommelsesplacering. Dette er den dybe kopi og kan kun opnås ved hjælp af en brugerdefineret kopikonstruktør.
Nedenfor gives et komplet C ++ - program, der implementerer alle tre typer konstruktører og deres anvendelse til konstruktion af 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 : '< Produktion:
********** s **********
Elev-ID: 1
Studerendes navn: abc
Studerendes alder: 10
********** s2 **********
Elev-ID: 2
Studerendes navn: xyz
Studerendes alder: 12
Skærmbilledet for det samme er angivet nedenfor.

I dette program har vi defineret en klasselev, der svarer til den, der er defineret i det foregående program. Forskellen er, at i stedet for at læse dataelementværdier fra standardinput gennem en funktion, definerer vi tre konstruktører.
Det er absolut muligt for en klasse at have mere end en konstruktør. Vi har en standardkonstruktør, der initialiserer datamedlemmerne til startværdier. Dernæst definerer vi en parameteriseret konstruktør, der sender initialværdier som parametre til konstruktøren.
Dernæst definerer vi en kopikonstruktør, hvortil vi sender en konstant henvisning til et objekt fra elevklassen.
I hovedfunktionen opretter vi tre objekter separat ved hjælp af tre konstruktører. Første objekt s oprettes ved hjælp af standardkonstruktøren. Andet objekt s1 oprettes ved hjælp af den parametriserede konstruktør, mens det tredje objekt s2 oprettes ved hjælp af en kopikonstruktør.
Bemærk oprettelsen af det tredje objekt s2. Her tildeler vi det allerede oprettede objekt s1 til det nye objekt s2. Således når vi konstruerer et nyt objekt ved hjælp af det allerede eksisterende objekt, kaldes en kopikonstruktør af compileren.
hvordan man fjerner element fra array java
Opdragsoperatør
Vi kan også tildele værdierne for et objekt til et andet ved hjælp af en tildelingsoperator (=). I dette tilfælde har vi en erklæring som s1 = s.
Forskellen mellem kopikonstruktør og tildelingsoperatør er, at mens kopikonstruktøren helt konstruerer et nyt objekt, tildeler tildelingsoperatøren blot værdierne for et medlem af objektet på RHS til det for objektet på LHS. Dette betyder, at objekterne på begge sider af en opgaveoperatør skal være eksisterende inden tildelingen.
Destroyers
En destruktor er også en speciel funktion som en konstruktør, men den implementerer den funktionalitet, der er nøjagtig modsat konstruktøren. Mens konstruktør bruges til at oprette et objekt, bruges en destruktør til at ødelægge eller slette et objekt.
Nogle af egenskaberne ved destruktøren inkluderer:
- Et destruktørnavn er det samme som klassenavnet, men begynder med et tilde (~) tegn.
- Destructor har ingen returtype.
- En destruktør har ingen argumenter.
- Der kan kun være en destruktør i en klasse.
- Compileren opretter altid en standarddestruktør, hvis vi ikke leverer en til en klasse.
Den generelle syntaks for en destruktør er:
~classname(){ //cleanup code }
En klasses destruktør kaldes normalt i følgende situationer:
- Når objektet går ud af omfanget, kaldes klassedestruktøren automatisk.
- På samme måde kaldes destruktoren, når programmet afslutter udførelsen. Dette betyder, at alle objekter også ophører med at eksistere. Derfor kaldes ødelæggeren af hvert objekt.
- Klassens destruktør kaldes også, når operatøren 'slet' for at slette et objekt udføres.
- Vi kan også ringe til destruktoren eksplicit for at udføre oprydningsaktiviteter, når vi er færdige med objektfunktionaliteten.
Eksemplet nedenfor viser, hvordan en destruktør fungerer.
#include using namespace std; class sample{ public: sample(){ cout<<'Constructor::sample called'< Produktion:
Konstruktør :: prøve kaldet
Dette er prøveklasse
Destructor :: ~ prøve kaldet
Skærmbilledet til ovenstående output er angivet nedenfor.

Vi har defineret en klasseprøve, hvor vi har defineret en konstruktør, en destruktor og et funktionsdisplay. I hovedfunktionen opretter vi et objekt obj af klasseeksempel og kalder derefter displayfunktionen på dette objekt.
Derefter udføres et retur 0. I output kan vi se, at det øjeblik, hvor displayfunktionen vender tilbage, og programstyringen kommer til sætning return 0, destruktoren udføres. Dette betyder, at det udføres i det øjeblik, hvor objektet går ud af omfanget.
'Denne' markør
C ++ bruger et specielt koncept relateret til objekterne, der er kendt som “denne” markør. 'Denne' markør peger altid på det aktuelle objekt. Afhængig af situationen bruger vi 'denne' markør, når vi skal henvise til det aktuelle objekt.
Vi ved, at hver gang der oprettes en forekomst af klassen, dvs. et objekt, laves der en separat kopi af dataene i klassen til objektet. Men når det kommer til medlemsfunktionerne i klassen, deler alle objekter den samme kopi.
Så når et eller flere objekter får adgang til medlemsfunktionerne samtidigt, hvordan kan vi så sikre, at der er adgang til og ændrede korrekte datamedlemmer af medlemsfunktionerne?
Dette er stedet, hvor 'denne' markør kommer til handling. Compileren sender en implicit markør med funktionsnavnet som “dette”. Dette kaldes “denne” markør.
'Denne' markør sendes som et skjult argument til alle medlemsfunktionens opkald. Det er normalt en lokal variabel. Derfor er 'denne' markør en konstant markør, og dens indhold er det aktuelle objekts hukommelsesadresse.
Bemærk, at denne markør kun er tilgængelig for ikke-statiske medlemsfunktioner og ikke for statiske funktioner. Dette skyldes, at de statiske funktioner ikke behøver at få adgang til ved hjælp af et objekt. Der er direkte adgang til dem ved hjælp af klassenavnet.
Vi bruger normalt 'denne' markøren i situationer, hvor medlemsvariablerne og parametrene sendes til initialisering af medlemsvariablerne, der har samme navn. Vi bruger det også, når vi har brug for at returnere det aktuelle objekt fra funktionen.
Lad os se demonstrationen af 'denne' markør 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 = '< Produktion:
tal = 100
ch = A
I ovenstående program har vi en klasse, der hedder Sample, med to data-medlemmers num og ch. Vi har en medlemsfunktion setParam, der sender parametrene med de samme navne, num og ch for at indstille værdierne for medlemsvariablerne.
Inde i funktionen tildeler vi disse værdier til de aktuelle variabler for objektmedlemmer, der er angivet med denne markør. Når værdierne er indstillet, returneres det aktuelle objekt “dette” fra funktionen.
I hovedfunktionen opretter vi først et objekt af prøveklasse, obj og kalder en setParam-funktion for at indstille værdierne og kalder derefter funktionen printValues for at udskrive værdierne.
Konklusion
Vi har lært de grundlæggende byggesten i OOP i C ++ i denne vejledning. At forstå klasser og objekter er de primære krav, til at begynde med, OOP i C ++. Vi har også lært om konstruktører og destruktører i detaljer med eksempler.
I vores kommende vejledning lærer vi om initialiseringslisterne i C ++.
=> Pas på den enkle C ++ træningsserie her.
Anbefalet læsning
- Python OOP-koncepter (Python-klasser, objekter og arv)
- Java-interface og abstrakt klasseundervisning med eksempler
- Arbejde med VBScript Excel-objekter
- QTP Tutorial # 7 - QTP's objektidentifikationsparadigme - Hvordan QTP identificerer objekter entydigt?
- Objektlager i QTP - Tutorial # 22
- Arbejde med VBScript ADODB-forbindelsesobjekter
- Runtime Polymorphism In C ++
- Arv i C ++