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.
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.
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.
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
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 č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; }