Šajā apmācībā mēs uzzināsim par iekapsulēšanu C ++, izmantojot piemērus.
Iekapsulēšana ir viena no objektorientētās programmēšanas galvenajām iezīmēm. Tas ietver datu dalībnieku un funkciju apvienošanu vienā klasē.
Līdzīgu datu dalībnieku un funkciju apvienošana klases iekšienē arī palīdz slēpt datus.
C ++ iekapsulēšana
Kopumā iekapsulēšana ir līdzīga koda iesaiņošanas process vienā vietā.
Programmā C ++ mēs varam apvienot datu dalībniekus un funkcijas, kas darbojas kopā vienas klases ietvaros. Piemēram,
class Rectangle ( public: int length; int breadth; int getArea() ( return length * breadth; ) );
Iepriekš minētajā programmā funkcija getArea()
aprēķina taisnstūra laukumu. Lai aprēķinātu platību, tam nepieciešams garums un platums.
Tādējādi datu dalībnieki (garums un platums) un funkcija klasē getArea()
tiek turēti kopā Rectangle
.

1. piemērs: C ++ iekapsulēšana
// Program to calculate the area of a rectangle #include using namespace std; class Rectangle ( public: // Variables required for area calculation int length; int breadth; // Constructor to initialize variables Rectangle(int len, int brth) : length(len), breadth(brth) () // Function to calculate area int getArea() ( return length * breadth; ) ); int main() ( // Create object of Rectangle class Rectangle rect(8, 6); // Call getArea() function cout << "Area = " << rect.getArea(); return 0; )
Rezultāts
Platība = 48
Iepriekš minētajā piemērā mēs aprēķinām taisnstūra laukumu.
Lai aprēķinātu platību, mums ir divi mainīgie: garums un platums, un funkciju: getArea()
. Tādējādi mēs apvienojām šos mainīgos un funkcionējam vienā klasē ar nosaukumu Taisnstūris.
Šeit mainīgajiem un funkcijām var piekļūt arī no citām klasēm. Tādējādi tā nav datu slēpšana .
Tā ir tikai iekapsulēšana . Mēs vienkārši glabājam līdzīgus kodus.
Piezīme. Cilvēki bieži uzskata iekapsulēšanu par datu slēpšanu, taču tā nav pilnīgi taisnība.
Iekapsulēšana attiecas uz saistīto lauku un metožu apvienošanu kopā. To var izmantot, lai panāktu datu slēpšanu. Iekapsulēšana pati par sevi nav datu slēpšana.
Kāpēc iekapsulēšana?
- Programmā C ++ iekapsulēšana palīdz mums saglabāt saistītos datus un funkcijas kopā, kas padara mūsu kodu tīrāku un viegli lasāmu.
- Tas palīdz kontrolēt mūsu datu dalībnieku modifikācijas.
Apsveriet situāciju, kad mēs vēlamies, lai garuma lauks klasē nebūtu negatīvs. Šeit mēs varam padarīt garuma mainīgo privātu un pielietot loģiku metodes iekšienēsetAge()
. Piemēram,
class Rectangle ( private: int age; public: void setLength(int len) ( if (len>= 0) length = len; ) );
- Par vaislas un noteicēji funkcijas nodrošina tikai lasīšanas vai rakstīšanas tikai piekļuvi saviem klases biedriem. Piemēram,
getLength() // provides read-only access setLength() // provides write-only access
- Tas palīdz atdalīt sistēmas komponentus. Piemēram, kodu varam iekapsulēt vairākos saišķos.
Šos atdalītos komponentus (saišķus) var izstrādāt, pārbaudīt un atkļūdot neatkarīgi un vienlaikus. Un jebkuras izmaiņas konkrētā komponentā nekādi neietekmē citus komponentus. - Mēs varam panākt arī datu slēpšanu, izmantojot iekapsulēšanu. 1. piemērā , ja mainām garuma un platuma mainīgos uz
private
vaiprotected
, tad piekļuve šiem laukiem ir ierobežota.
Viņi tiek paslēpti no ārējām klasēm. To sauc par datu slēpšanu .
Datu slēpšana
Datu slēpšana ir veids, kā ierobežot mūsu datu dalībnieku piekļuvi, slēpjot ieviešanas detaļas. Iekapsulēšana arī nodrošina iespēju slēpt datus.
Mēs varam izmantot piekļuves modifikatorus, lai panāktu datu slēpšanu C ++. Piemēram,
2. piemērs: C ++ datu slēpšana, izmantojot privāto specifikatoru
#include using namespace std; class Rectangle ( private: // Variables required for area calculation int length; int breadth; public: // Setter function for length void setLength(int len) ( length = len; ) // Setter function for breadth void setBreadth(int brth) ( breadth = brth; ) // Getter function for length int getLength() ( return length; ) // Getter function for breadth int getBreadth() ( return breadth; ) // Function to calculate area int getArea() ( return length * breadth; ) ); int main() ( // Create object of Rectangle class Rectangle rectangle1; // Initialize length using Setter function rectangle1.setLength(8); // Initialize breadth using Setter function rectangle1.setBreadth(6); // Access length using Getter function cout << "Length = " << rectangle1.getLength() << endl; // Access breadth using Getter function cout << "Breadth = " << rectangle1.getBreadth() << endl; // Call getArea() function cout << "Area = " << rectangle1.getArea(); return 0; )
Rezultāts
Garums = 8 platums = 6 laukums = 48
Šeit mēs esam izveidojuši garuma un platuma mainīgos private
.
Tas nozīmē, ka šiem mainīgajiem nevar tieši piekļūt ārpus Rectangle
klases.
Lai piekļūtu šīm privātās mainīgos, mums ir izmantotas public
funkcijas setLength()
, getLength()
, setBreadth()
, un getBreadth()
. Tās sauc par getter un setter funkcijām.
Mainītāju mainīšana uz privātu ļāva mums ierobežot nesankcionētu piekļuvi ārpus klases. Tā ir datu slēpšana .
Ja mēs mēģināsim piekļūt mainīgajiem no main()
klases, mēs saņemsim kļūdu.
// error: rectangle1.length is inaccessible rectangle1.length = 8; // error: rectangle1.breadth is inaccessible rectangle1.length = 6;