C++-toegangsspecificaties

C Access Specifiers



In C++ is een klasse een set variabelen en functies die zijn geconfigureerd om samen te werken. Wanneer de variabelen van de klasse waarden krijgen, wordt een object verkregen. Een object heeft dezelfde variabelen en functies als een klasse, maar deze keer hebben de variabelen waarden. Vanuit één klasse kunnen veel objecten worden gemaakt. Het ene object verschilt van een ander object volgens de verschillende reeks waarden die aan de variabelen van het andere object zijn toegewezen. Het maken van een object uit een klasse zou het object instantiëren. Zelfs als twee verschillende objecten dezelfde waarden hebben voor hun variabelen, zijn deze objecten verschillende entiteiten, geïdentificeerd door verschillende namen in het programma. De variabelen voor een object en de bijbehorende klasse worden gegevensleden genoemd. De functies van een object en de bijbehorende klasse worden lidfuncties genoemd. Gegevensleden en lidfuncties worden leden genoemd.

Het woord toegang betekent het lezen of wijzigen van de waarde van een variabele, en het betekent ook het gebruik van een functie. C++-toegangsspecificaties zijn de woorden privé, beschermd en openbaar. Ze beslissen of een lid toegang heeft tot andere leden van zijn klas, of dat een functie of operator buiten de klas en die niet tot de klas behoort, toegang heeft tot een lid van de klas. Ze beslissen ook of een lid van een afgeleide (kind)klasse toegang heeft tot een lid van een bovenliggende klasse.







Basiskennis van C++ is vereist om dit artikel te begrijpen en de verstrekte code te testen.



Artikel Inhoud

De publieke en private specificaties

Klas
Elk lid van een klas heeft toegang tot elk ander lid van diezelfde klas, waarvan het label openbaar of privé is. Denk aan het volgende programma:



#erbij betrekken
gebruik makend van naamruimteuur;

klasDe Cla
{
privaat:
intaantal1;
intaantal2;
openbaar:
De Cla(intn1,intn2)
{
aantal1=n1;aantal2=n2;
}
intmethode()
{
opbrengstaantal1;
}
};

inthoofd()
{
TheCla obj(10,twintig);
intnee2=obj.methode();
kosten<<nee2<<'N';

// int no1 = obj.num1;

opbrengst 0;
}

De output is 10. De private leden zijn num1 en num2. De openbare leden zijn TheCla() en method(). Merk op dat TheCla() de constructorfunctie is die variabelen van belang initialiseert. De regio van een toegangsspecificatie begint vanaf het label tot het einde van de klassebeschrijving (definitie) of tot het begin van een andere toegangsspecificatie.





In de functie main() is de eerste instructie de instantie waarbij de constructorfunctie betrokken is, die num1 en num2 initialiseert. De volgende instructie roept het openbare lid, method(), van de klasse aan.

Nu, in de klassebeschrijving (definitie), heeft de openbare lidfunctie, TheCla(), toegang tot de privéleden, num1 en num2. Ook heeft de openbare lidfunctie, method(), toegang tot het privélid, num1. Elk lid binnen een klasbeschrijving heeft toegang tot elk ander lid binnen dezelfde klasbeschrijving; het maakt niet uit welk lid privé of openbaar is.



Een functie of operator die niet is gedeclareerd in de klassebeschrijving en buiten de klassebeschrijving, heeft echter alleen toegang tot openbare leden van de klasse. De functie main() is bijvoorbeeld een functie die buiten de klassebeschrijving wordt gedeclareerd. Het heeft alleen toegang gekregen tot de method() en de TheCla() openbare leden. Binnen de functie main() is de functie TheCla() obj(10, 20).

Een externe functie of een externe operator, zoals de functie main(), heeft geen toegang tot de privéleden van de klasse, zoals num1 of num2. Verwijder de commentaarindicator, //, van de voorlaatste instructie in main(). Als u het programma probeert te compileren, houd er dan rekening mee dat het programma niet zal compileren en een foutmelding geeft.

Standaard specificatie
De standaardspecificatie voor een klasse is privé. De bovenstaande klassebeschrijving is dus hetzelfde als de volgende beschrijving, privé, maar zonder de specificatie:

klasDe Cla
{
intaantal1;
intaantal2;
openbaar:
De Cla(intn1,intn2)
{
aantal1=n1;aantal2=n2;
}
intmethode()
{
opbrengstaantal1;
}
};

Opmerking : het toegangsspecificatielabel begint met de specificatie en wordt gevolgd door een dubbele punt.

De beschermde specificatie

Binnen een klassebeschrijving en van een externe functie of externe operator is de beschermde specificeerder dezelfde als de private specificeerder. Vervang nu de private specificatie in het bovenstaande programma door de specificatie, bescherm en verwijder de commentaarindicator, //, van de voorlaatste instructie in de main() functie. Als u het programma probeert te compileren, houd er dan rekening mee dat het programma niet zal compileren en een foutmelding geeft.

Het probleem van de beschermde specificatie doet zich voor wanneer leden van de afgeleide (overgenomen) klasse toegang moeten hebben tot leden van de basisklasse (ouder).

Publiek afgeleide klasse met openbare leden
Denk aan het volgende programma:

#erbij betrekken
gebruik makend van naamruimteuur;

klasDe Cla
{
openbaar:
intaantal1= 10;
beschermd:
intaantal2= twintig;
privaat:
intnum3= 30;
};

klasKindCla: openbaarDe Cla
{
openbaar:
intmethode1()
{
opbrengstaantal1;
}
intmethode2()
{
opbrengstaantal2;
}
/*int methode3()
{
retour num3;
} * /

};

inthoofd()
{
KindCla kindObj;
intnee1=kindObj.methode1();
kosten<<nee1<<'N';

intnee2=kindObj.methode2();
kosten<<nee2<<'N';

opbrengst 0;
}

De uitvoer is::
10
twintig

In de basisklasse is num1 openbaar, is num2 beveiligd en is num3 privé. In de afgeleide klasse zijn alle lidfuncties openbaar. De eerste functie, methode1(), geeft toegang tot het openbare gegevenslid num1. De tweede functie, method2(), geeft toegang tot het beveiligde gegevenslid num2. De derde functie, method3(), hoewel deze momenteel niet is becommentarieerd, zou toegang moeten hebben tot het privégegevenslid num3.

Een afgeleide klasse wordt niet gedeclareerd zonder een toegangsspecificatie (openbaar, beveiligd of privé). Hierboven wordt de afgeleide klasse gedeclareerd met de openbare specificatie, dat wil zeggen:

klasKindCla: openbaarDe Cla{}

Maak nu het commentaar op de derde lidfunctiedefinitie in de afgeleide klasse ongedaan. Als u het programma probeert te compileren, houd er dan rekening mee dat het niet zal compileren en een foutmelding geeft.

Opmerking : Wanneer de hele afgeleide klasse openbaar is verklaard, hebben de leden geen toegang tot de privéleden van de basisklasse. De leden hebben echter toegang tot de openbare en beschermde leden van de basisklasse. Bovenstaand programma illustreert dit.

Houd er echter rekening mee dat een openbaar lid van de openbare afgeleide klasse toegang heeft tot een beschermd lid van de basisklasse.

Afgeleide klassespecificaties en ledenspecificaties

Beschermde afgeleide klasse met openbare leden
Vervang de openbare specificatie door beschermd in de verklaring van de afgeleide klasse hierboven, als volgt:

klasKindCla: beschermdDe Cla{}

Compileer en voer het programma uit en merk op dat het resultaat hetzelfde is als voorheen.

Dus wanneer de hele afgeleide klasse beschermd wordt verklaard, hebben de leden geen toegang tot de privéleden van de basisklasse. De leden hebben echter toegang tot de openbare en beschermde leden van de basisklasse. Dit is hetzelfde als wanneer de afgeleide klasse openbaar wordt verklaard.

Opmerking : een beschermd lid van de openbare afgeleide klasse heeft toegang tot een beschermd lid van de basisklasse.

Privé afgeleide les met openbare leden
Vervang de beschermde specificatie door private in de declaratie van de afgeleide klasse hierboven, als volgt:

klasKindCla: privaatDe Cla{}

Compileer en voer het programma uit en merk op dat het resultaat hetzelfde is als voorheen.

Dus wanneer de hele afgeleide klasse privé wordt verklaard, hebben de leden geen toegang tot de privéleden van de basisklasse. De leden hebben echter toegang tot de openbare en beschermde leden van de basisklasse. Dit is hetzelfde als wanneer de afgeleide klasse beschermd of openbaar wordt verklaard.

Publieke afgeleide les met beschermde leden
Typ, compileer en voer het volgende programma uit, waarin de hele afgeleide klasse is beveiligd, en de leden ervan ook. Sommige codesegmenten zijn als volgt:

#erbij betrekken
gebruik makend van naamruimteuur;

klasDe Cla
{
openbaar:
intaantal1= 10;
beschermd:
intaantal2= twintig;
privaat:
intnum3= 30;
};

klasKindCla: openbaarDe Cla
{
beschermd:
intmethode1()
{
opbrengstaantal1;
}
intmethode2()
{
opbrengstaantal2;
}
/*int methode3()
{
retour num3;
} * /

};

inthoofd()
{
/*ChildCla childObj;
int no1 = childObj.methode1();
kosten<
/*int no2 = childObj.method2();
kosten<
opbrengst 0;
}

Het programma werkt zoals het is. Er is geen uitvoer, en er wordt verondersteld dat er geen uitvoer is, gebaseerd op hoe het programma is getypt.

Maak nu het commentaar van de functiedefinitie, method3(), in de afgeleide klasse ongedaan. Als u het programma probeert te compileren, houd er dan rekening mee dat het niet zal compileren en een foutmelding geeft. Dit betekent dat een privélid niet toegankelijk is vanuit een externe functie, externe operator of afgeleide klasse. Dit is dezelfde conclusie als hierboven werd geconcludeerd met betrekking tot toegang tot een particulier lid.

Opmerking : een beschermd lid van de beschermde afgeleide klasse heeft toegang tot een beschermd lid van de basisklasse.

Plaats nu de opmerkingen terug in de afgeleide klasse en verwijder het commentaar op het eerste codesegment in de functie main(). Als u het programma probeert te compileren, houd er dan rekening mee dat het programma niet zal compileren vanwege het eerste codesegment in de functie main(). Dit effect is niet nieuw. Afgezien van de afgeleide klasse, externe functies en externe operators, hebben de beschermde en privé-leden van een (basis- of afgeleide) klasse dezelfde specificatie, privé. De functie main() ziet het beschermde lid van elke klasse, of het nu basis of afgeleid is, als van dezelfde specificatie, privé, en het is verboden er toegang toe te krijgen.

Als het tweede codesegment van de functie main() geen commentaar heeft, is dezelfde uitleg van toepassing. Dat wil zeggen dat de functie main() geen toegang heeft tot een beschermd of privélid van de afgeleide klasse of van de basisklasse. Dit is onafhankelijk van het feit of een beschermd lid van de afgeleide klasse toegang zou kunnen krijgen tot een beschermd lid van de basisklasse.

Beschermde afgeleide klasse met beschermde leden
Vervang de openbare specificatie door beschermd in de verklaring van de afgeleide klasse hierboven, als volgt:

klasKindCla: beschermdDe Cla{}

Plaats de opmerking van de codesegmenten terug in de functie main(), als dit nog niet is gebeurd. Compileer en voer het programma uit en merk op dat het resultaat is zoals voorheen.

Privé afgeleide les met beschermde leden
Vervang de beschermde specificatie door private in de declaratie van de afgeleide klasse hierboven, als volgt:

klasKindCla: privaatDe Cla

Compileer en voer het programma uit en merk op dat het resultaat zal zijn zoals voorheen.

Publieke afgeleide les met privéleden
Vervang de private specificatie door public in de declaratie van de afgeleide klasse hierboven, als volgt:

klasKindCla: openbaarDe Cla{}

Maak de leden van de afgeleide klasse privé. Compileer en voer het programma uit. Het resultaat is niet anders dan bij de zaak Public Derived Class with Protected Members.

Beschermde afgeleide klasse met privéleden
Vervang de openbare specificatie door beschermd in de verklaring van de afgeleide klasse hierboven, als volgt:

klasKindCla: beschermdDe Cla{}

Compileer en voer het programma uit. Dit resultaat verschilt niet van de zaak Beschermde afgeleide klassen met beschermde leden.

Privé afgeleide les met privéleden
Vervang de beschermde specificatie door private in de declaratie van de afgeleide klasse hierboven, als volgt:

klasKindCla: privaatDe Cla{}

Compileer en voer het programma uit. Dit resultaat verschilt niet van de Private Derived Class with Protected Members-zaak.

Conclusie

C++-toegangsspecificaties zijn de woorden privé, beschermd en openbaar. Zij bepalen de toegang voor leden van een klas. De regio van een toegangsspecificatie begint vanaf het label, tot het einde van de klassebeschrijving (definitie), of tot het begin van een andere toegangsspecificatie. Elk lid van een klas heeft toegang tot elk ander lid van diezelfde klas. Een privélid van een klasse is niet toegankelijk voor een externe functie, een externe operator of een afgeleide klasse.

Het lid van de basisklasse moet beveiligd worden gemaakt zodat een privélid van de basisklasse kan worden benaderd door een lid van de afgeleide klasse. Dit beschermde lid van de basisklasse wordt door een externe functie of een externe operator gezien als een privélid van de basisklasse.

Een openbaar lid van een klasse is toegankelijk voor elke externe functie, elke externe operator of een afgeleide klasse.

Als er geen toegangsspecificatie in een klasse is, wordt de privéspecificatie aangenomen. Dat wil zeggen, de standaard toegangsspecificatie is privé.

Referenties gebruikt in dit werk