01 - Osnovi o klasama i objektima
Osnovi o klasama i objektima
  • Definicija klase
  • Deklaracija objekata
  • Tipovi specifikatora pristupa
  • Pristup podacima članovima
  • Funkcije članice klase
  • Privatni (private) članovi klase
01
Definicija klase
Definicija klase počinje ključnom rečju class za kojom sledi ime klase i telo klase oivičeno parom vitičastih zagrada

Pri kreiranju klase se u stvari definiše šablon za neki tip podatka. Definicija klase zapravo definiše značenje klase, tj. definiše šta će objekat ove konkretne klase sadržati i koje su to operacije koje će moći da se obavljaju nad objektom.

Definicija klase počinje ključnom rečju class za kojom sledi ime klase i telo klase oivičeno parom vitičastih (velikih) zagrada. U nastavku definišemo nov tip podatka Box korišćenjem ključne reči class:

class Box
{
   public:
    double length;   // Duzina kutije
    double breadth;  // Sirina kutije
    double height;   // Visina kutije
};

Definicija klase se mora završiti sa tačka-zarez znakom. U okviru tela klasa možete primetiti ključnu reč public koja određuje tip pristupa članovima klase koji slede nakon nje. Pristup označen kao public, odnosno javni pristup, znači da je tim članovima klase moguće pristupiti iz bilo kog dela programa u kome je moguće koristiti objekat te klase.

Deklaracija objekata
Deklaracija objekta se vrši na isti način kako se deklarišu promenljive osnovnih tipova podatka

Neki objekat je jedna instanca klase. Pošto se definiše klasa, mogu se zatim u programu kreirati objekti kao instance klase, i može se u programu manipulisati objektima. U nastavku je primer deklaracije dva objekta klase Box:

Box Box1; // Deklaracija objekta Box1 tipa Box
Box Box2; // Deklaracija objekta Box2 tipa Box

Treba znati da će i Box1 i Box2 imati sopstvene kopije podataka klase dok će funkcije, odnosno ponašanja objekata, biti zajednička.

Alternativno, kreiranje novih instanci klase može se realizovati u toku definisanja klase, a pre navođenja znaka tačka-zarez :

class Friend 
{
public: 
    string surname; 
    int phone;
} John, Jane;

John i Jane su dakle konkretne instance klase Friend.

Tipovi specifikatora pristupa
Ograničavanje pristupa članovima klase se specificira korišćenjem labela public, private i protected (tj. specifikatora pristupa) kojima se označavaju odgovarajuće sekcije unutar tela klase

Ograničavanje pristupa članovima klase se specificira korišćenjem oznaka (labela) public, private, i protected kojima se označavaju odgovarajuće sekcije unutar tela klase. Ključne reči public, private, i protected se nazivaju specifikatori pristupa.

Unutar jedne klase može da postoji više sekcija označenih labelama public, protected, ili private. Svaka sekcija je pod uticajem jednog specifikatora sve dok se ne navede nova labela ili dok se ne zatvori desna vitičasta zagrada koja predstavlja kraj definicije klase. Podrazumevani specifikator pristupa, kada se ne navede nijedan drugi, je private. Pogledajmo ilustrativan primer:

class Base 
{
   public:
  // ovde dolaze javni clanovi klase
 
   protected:
  // ovde dolaze zasticeni clanovi klase
 
   private:
  // ovde dolaze privatni clanovi klase
};

Zaštićeni članovi klase - protected – su veoma slični privatnim (private) članovima klase, ali imaju jednu dodatnu pogodnost, a to je da im se može pristupiti iz nasleđenih klasa, koje se drugačije nazivaju izvedene klase. O нasleđivanju više reči u nekoj od narednih lekcija.

Pristup podacima članovima
Javnim (public) podacima objekata klase može se pristupiti korišćenjem operatora pristupa (.), što nije dozvoljeno kod privatnih (private) i zaštićenih (protected) članova klase

Javnim (public) podacima objekata klase može se pristupiti korišćenjem operatora pristupa (.). Pogledajmo sledeći primer da bi operacija pristupa bila jasnija (koristimo prethodno definisanu klasu Box):

#include <iostream>
using namespace std;
class Box {/*ubaciti kod definicije klase Box*/};
void main( )
{
   Box Box1;        // Deklaracija objekta Box1 tipa Box
   double volume = 0.0; // Ovde cuvamo zapreminu boksa
 
   // Specifikacija objekta box 1
   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;

   // zapremina objekta box 1
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Zapremina od Box1 : " << volume <<endl;
}

Nakon izvršavanja programa dobija se sledeći rezultat:

Zapremina od Box1 : 210

Funkcije članice klase
Najčešća praksa je da se deklaracija funkcije članice navede u okviru definicije klase, a da se implementacija izvrši van tela klase i to u nekom drugom fajlu

Uzmimo prethodno pomenutu klasu Box, i u njoj napišimo definiciju funkcije koja će imati pristup ostalim članicama klase, umesto da tim članovima pristupamo direktno:

class Box
{
   public:
    double length;   // Duzina kutije
    double breadth;  // Sirina kutije
    double height;   // Visina kutije
    double getVolume(void);// Vraca zapreminu kutije
};

Funkcije članice mogu biti definisane ili u okviru tela klase, ili van tela klase korišćenjem operatora pristupa (scope resolution operator),::. Stoga je moguće funkciju za određivanje zapremine definisati korišćenjem operatora pristupa :: van tela klase:

double Box::getVolume(void)
{
    return length * breadth * height;
}

Naravno, navodimo ime klase ispred operatora ::. Funkciju možemo da definišemo i unutar klase na sledeći način:

class Box
{
   public:
    double length;   // Duzina kutije
    double breadth;  // Sirina kutije
    double height;   // Visina kutije
   
    double getVolume(void)
    {
        return length * breadth * height;
    }
};

Funkcija članica klase može biti pozvana korišćenjem operatora tačke (.) uz odgovarajući objekat te klase, kao što je opisano u sledećem primeru:

// Kreira objekat
Box myBox;
// Poziva funkciju clanicu objekta myBox
myBox.getVolume();
Privatni (private) članovi klase
Privatni članovi klase nisu vidljivi niti im se može direktno pristupiti izvan klase u kojoj su definisani. Podrazumeva se da su svi članovi klase privatni kada nije naveden specifikator

Privatni članovi klase (podaci i funkcije klase označeni kao private) nisu vidljivi niti im se može direktno pristupiti izvan klase u kojoj su definisani. Jedino funkcije članice klase, ili prijateljske funkcije (o kojima će biti više reči u sledećoj lekciji) mogu da pristupe i menjaju privatne članice klase.

U sledećoj klasi Box polje width je privatni podatak klase, što znači da svi članovi klase pre navođenja bilo koje labele su podrazumevano privatni (private):

#include <iostream>
using namespace std;
class Box
{
    double width;
public:
    double length;
    void setWidth( double wid );
    double getWidth( void );
};

Praksa je da se podaci definišu u okviru sekcije označene kao private, a odgovarajuće povezane funkcije u javnoj (public) sekciji tako da te funkcije mogu biti pozvane van klase u cilju pristupa i promene privatnih članova, kao što je navedeno u sledećem primeru:

// Defincija funkcija clanica klase
double Box::getWidth(void)
{
    return width ;
}
 
void Box::setWidth( double wid )
{
    width = wid;
}
 
// Glavna main funcija programa
int main( )
{
   Box box;
 
   // postaviti duzinu kutije bez koriscenja funkcije clanice
   box.length = 10.0; // OK: jer je length javno
   cout << "Duzina kutije : " << box.length << endl;
 
   // postaviti sirinu kutije bez koriscenja funkcije clanice
   // box.width = 10.0; // Greska: jer je width privatno
   box.setWidth(10.0);  // Koristiti funkciju clanicu da postavite sirinu
   cout << "Sirina kutije : " << box.getWidth() << endl;
 
   return 0;
}