C++ Klase 1

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 25

Elektrotehniki fakultet

Banja Luka

Programski jezici 1

KLASE I APSTRAKCIJA PODATAKA

1. dio

Goran Banjac
goran.banjac@etfbl.net

12/3/15

Klase 1. dio
Sadraj

Razlike C/C++ programiranja


Osnovne karakteristike klase
Definisanje klase
Specifikatori pristupa lanovima klase
Razlike izmeu definicije i deklaracije klase
Oblast definisanosti i pristup lanovima klase
Pomone funkcije u klasi
Modularizacija
Inicijalizacija objekata konstruktori
Destruktori
Redoslijed izvravanja konstruktora i destruktora

Osnovne razlike C i C++


programiranja
Programiranje u jeziku C Programiranje u jeziku
C++

Proceduralno (algoritamski)
orijentisano

Jedinica programiranja FUNKCIJA

Programeri se koncentriu na
pisanje funkcija, funkcije se
grupiu u program

Objektno orijentisano

Jedinica programiranja
KLASA

Programeri se koncentriu
na kreiranje vlastitih
tipova podataka KLASE

Podaci nisu primarni, oni su u


funkciji podrke akcijama koje
funkcije izvode
Glagoli odreuju ta sistem radi i
koje e funkcije biti
implementirane
Instance ugraenih tipova
(int, char, ) nazivaju se
promjenljive (varijable)

Imenice su te koje
odreuju sistem (imenice
odreuju klase)
Svaka klasa sadri
podatke i funkcije za

Osnovne karakteristike klase


KLASA omoguava modelovanje objekata, koje karakteriu:

atributi (podaci lanice data members)

ponaanje ili operacije (funkcije lanice member functions)


U nekim OO programskim jezicima
funkcije lanice se nazivaju
metode.

Najvanije karakteristike KLASE kao pravog tipa podataka:

Odreuju mogue vrijednosti objekata,

Odreuju mogue operacije nad objektima,

Obezbjeuju obaveznu inicijalizaciju objekata pri njihovom


stvaranju,

Obezbjeuju unitavanje objekata kada vie nisu potrebni,

Obezbjeuju enkapsulaciju atributa i ponaanja u jedinstvenu


cjelinu,

Omoguavaju princip skrivanja informacija (information hiding).

Definisanje klase
Opti oblik definicije
klase
KLASA se definie
korienjem kljune
rijei class.

class Ime
{

Uobiajeno naziv
klase zapoinje
velikim slovom.

tip clan;

public:

privatni lanovi klase

javni lanovi klase

tip clan;

private:
tip clan;

};

privatni lanovi klase

Primjer definicije klase


class Razlomak
{
public:
Razlomak();
void setBrojilac(int b);
void setImenilac(int n);
void printRazlomak();
float vrijednost();

Funkcije lanice
najee su javni
lanovi klase

Podaci lanice najee


su privatni lanovi
klase (skrivanje
informacija)

javni lanovi klase

private:
int brojilac;
int imenilac;
};

privatni lanovi klase

Specifikatori pristupa lanicama


klase
public

private

Sve lanice definisane iza


specifikatora public: su javne.

Sve lanice definisane iza


specifikatora private: su privatne.

Javna lanica klase dostupna je iz


bilo kojeg dijela programa u
kojem je dostupan objekat date
klase.

Privatnoj lanici klase ne moe se


pristupiti spolja, ve samo iz
unutranjosti klase.

Privatnoj lanici klase pristupa se


posredstvom funkcija lanica te klase.

Privatnoj lanici klase mogu da


pristupe i tzv. prijatelji klase, tj.
prijateljske funkcije klase.

Uobiajeno su podaci lanice


privatni lanovi klase (princip
skrivanja informacija).
Postoje i protected (zatieni)
lanovi klase primjenjuje se
kod nasljeivanja.

Javna lanica dostupna je i iz


unutranjosti klase.
Uobiajeno su funkcije lanice
javne lanice klase (funkcije opisuju
ponaanje, odnosno operacije nad
objektima).

Specifikatori pristupa:
mogu da mijenjaju mjesta,
mogu vie puta da se navode,
ako se izostavi, podrazumijeva se
private.

Definicija klase <-> Deklaracija


klase

Definicija klase podrazumijeva


navoenje svih lanica klase.

Kad je klasa definisana, mogu se


definisati (kreirati) i njene instance
(objekat, niz objekata, upuiva,
pokaziva na objekat).
Primjer:
Klasa objekat;
Klasa niz[100];
Klasa *pointer;
Klasa &upucivac = objekat;

Deklaracija klase
podrazumijeva da se samo
naznai (deklarie) da neki
identifikator predstavlja klasu.

Opti oblik deklaracije klase:

class Ime;

Ako je poznata samo deklaracije


klase ne mogu se instancirati
objekti, ve mogu samo da se
definiu pokazivai.

Definicija funkcija lanica klase


Funkcije lanice mogu da se
definiu unutar klase.
Primjer:
class Counter
{
private:
int count;
public:
...
void print()
{
cout << count;
}
...
};
Praksa pokazuje da je bolje unutar
klase navesti samo prototip, a
funkciju lanicu definisati izvan
funkcije.

Funkcije lanice mogu da se


definiu izvan klase, ali se
unutar klase treba navesti
njihov prototip.
Primjer:

class Counter
{
private:
int count;
public:
...
void print();
...
};
void Counter::print()
{
cout << count;
}

Oblast definisanosti i pristup


lanovima

lanice klase dostupne su svim ostalim lanicama date klase.


Referenciraju se navoenjem imena lanice.

Izvan klase, lanice klase mogu da se referenciraju pomou:

objekta - objekat.clanica

pokazivaa na objekat - pokazivac->clanica ili


(*pokazivac).clanica

upuivaa na objekat - upucivac.clanica

Promjenljive definisane u nekoj funkciji lanici vidljive su samo u toj


funkciji.

Ako je unutar funkcije lanice definisana promjenljiva sa istim


imenom kao neki podatak lan klase, onda lokalna promjenljiva
maskira podatak lan.

Pristup maskiranom atributu preko operatora za razrjeavanje


dosega (::).

Oblast definisanosti i pristup


lanovima
Primjer:

Podatak lan x je javni atribut. Ovo treba


izbjegavati!
Ovdje je korieno samo radi ilustracije pristupa!

#include <iostream>
using namespace std;
class Counter
{
public:
int x;
void print() { cout << x << endl; }
};
int main()
{
Counter c;
Counter *pc = &c;
Counter &uc = c;

7
8
10

// kreira objekat c (instanca klase Counter)


// pointer na c
// upucivac na c

c.x = 7;
c.print();

// postavlja vrijednost atributa objekta


// direktan poziv funkcije lanice

uc.x = 8;
uc.print();

// postavlja vrijednost pomocu upucivaca


// poziv funkcije pomocu upucivaca

pc->x = 10;
pc->print();

// postavlja vrijednost pomocu pointera


// poziv funkcije pomocu pointera

Oblast definisanosti i pristup


lanovima
Primjer:
#include <iostream>
using namespace std;
int x; // globalna promjenljiva
class Klasa
{
public:
void set(int i) { x=i; }
void primjer();
private:
int x; // podatak clan
};
void Klasa::primjer()
{
int x=1; // lokalna promjenljiva
cout << "Lokalno x: " << x << endl;
cout << "Atribut x: " << Klasa::x << endl;
cout << "Globalno x: " << ::x;
}
int main()
{
Klasa t;
t.set(100);
t.primjer();
}

Lokalno x: 1
Atribut x: 100
Globalno x: 0

Oblast definisanosti i pristup


lanovima
Primjer:
#include <iostream>
using namespace std;
class Time
{
public:
void setTime(int, int, int);
void printM();
void printS();
private:
int sat, min, sek;
};
void Time::setTime(int
{
sat = ( h >= 0 && h
min = ( m >= 0 && m
sek = ( s >= 0 && s
}

h, int m, int s)
< 24 ) ? h : 0;
< 60 ) ? m : 0;
< 60 ) ? s : 0;

void Time::printM()
{
cout << (sat<10?"0":"") << sat << ":";
cout << (min<10?"0":"") << min;
}

void Time::printS()
{
cout << ((sat==12)?12:sat%12 ) << ":";
cout << (min<10 ? "0":"") << min << ":";
cout << (sek<10 ? "0":"") << sek;
cout << (sat<12 ? " AM" : " PM" );
}
int main()
{
Time t;
t.setTime(13,27,6);
cout << "Vrijeme : ";
t.printM(); cout<<" ili "; t.printS();
t.setTime(99,99,99);
cout << "\nPokusaj : ";
t.printM(); cout<<" ili "; t.printS();
}
Vrijeme : 13:27 ili 1:27:06 PM
Pokusaj : 00:00 ili 0:00:00 AM

Oblast definisanosti i pristup


lanovima
Privatnim lanovima klase mogu da
pristupe:

funkcije lanice date klase

prijateljske funkcije date klase.

Tipino se implementiraju sljedee funkcije


lanice:

za postavljanje atributa - tzv. set


funkcija
npr. setTime, setMin, setSek

za oitavanje atributa - tzv. get funkcija


npr. getSat, getMin, getSek

Primjer:
class Banka
{
private:
float stanje;
public:
...
void setStanje(float ns)
{ stanje = ns; }
float getStanje()
{ return stanje; }
...
};
...
Banka racun;
racun.setStanje(0);
cout << racun.getStanje();

Pomone funkcije u klasi

Ne moraju sve funkcije lanice da budu javne (pogotovo ako one


nisu dio interfejsa klase).

Ako neka funkcija slui kao pomona funkcija (helper ili utility
function) u klasi, tako da npr. neto rauna ili slino za neku drugu
funkciju lanicu klase, tada takvu pomonu funkciju ostavljamo kao
privatnu.

Funkcije lanice koje ine interfejs klase, odnosno omoguavaju pristup


privatnim lanovima klase nazivamo i pristupne funkcije (access
functions).

Funkcije lanice koje provjeravaju ispunjenost nekog uslova (npr. da


li je podatak ovakav ili onakav, da li je tampa spreman, da li je lift
zauzet i sl.) nazivaju se predikatske funkcije (predicate functions).

Modularizacija
U realizaciji veih programa preporuljivo je modularizovati kod.
Pri tome interfejs klase treba odvojiti od implementacije.
time.h (interfejs)

primjer.cpp (implementacija)

#ifndef TIME_H
#define TIME_H

#include <iostream>
#include "time.h"
using namespace std;

class Time
{
public:
void setTime(int, int, int);
void printM();
void printS();
private:
int sat, min, sek;
};
#endif
projekat.cpp (glavni program)
#include <iostream>
#include "time.h"
int main()
{
Time t; ...
}

void Time::setTime(int
{
sat = ( h >= 0 && h
min = ( m >= 0 && m
sek = ( s >= 0 && s
}

h, int m, int s)
< 24 ) ? h : 0;
< 60 ) ? m : 0;
< 60 ) ? s : 0;

void Time::printM()
{
cout << (sat<10?"0":"") << sat << ":";
cout << (min<10?"0":"") << min;
}
void Time::printS()
{
cout << ((sat==12)?12:sat%12 ) << ":";
cout << (min<10 ? "0":"") << min << ":";
cout << (sek<10 ? "0":"") << sek;
cout << (sat<12 ? " AM" : " PM" );
}

Inicijalizacija objekata KONSTRUKTORI

Konstruktor specijalna funkcija lanica koja omoguava


inicijalizaciju objekta prilikom njegovog kreiranja.

Konstruktor ima isto ime kao i klasa kojoj pripada.

Konstruktor nema tip ak ni void!

Konstruktor se automatski poziva svaki put kad se kreira neki objekat.


Primjer:
class Time
{
private:
int hh, mm, ss;
public:
...
Time() { hh = mm = ss = 0; }
...
};
...
Time t;

Inicijalizacija objekata KONSTRUKTORI

Iako programer eksplicitno ne poziva konstruktor pri kreiranju objekta,


ipak je mogue u konstruktor prenijeti parametre kojima e se
inicijalizovati atributi. Ovi parametri nazivaju se inicijalizatori i navode
se unutar malih zagrada prilikom definisanja objekta. Inicijalizatori
predstavljaju argumente koji se prosljeuju konstruktoru.
Primjer:

Klasa ne mora da ima konstruktor.


Objekti mogu da se inicijalizuju drugim
funkcijama lanicama.
Praksa pokazuje da je najbolje da
se objekat inicijalizuje
konstruktorom.

class Time
{
private:
int hh, mm, ss;
public:
Time(int h, int m, int s)
{
hh=h; mm=m; ss=s;
}
};

Time podne(12,0,0), ponoc(0,0,0);

Inicijalizacija objekata KONSTRUKTORI

Konstruktori mogu da se preklapaju vie konstruktora sa


preklopljenim imenom u klasi, to omoguava razliite naine
inicijalizacije objekata (razliita poetna stanja).
Primjer:
class Time
{
private:
int hh, mm, ss;
public:
Time(int h, int m, int s)
{ hh=h; mm=m; ss=s; }
Time(int s)
{ hh=s/3600; mm=(s%3600)/60; ss=s%60; }
};
...
Time podne(12,0,0);
Time petdo12(11,55,0);
Time ponoc(0);

Inicijalizacija objekata KONSTRUKTORI

Konstruktor moe da ima i podrazumijevane vrijednosti


argumenata.
Primjer:
class Time
{
private:
int hh, mm, ss;
public:
Time(int h=0, int m=0, int s=0)
{
hh=h; mm=m; ss=s;
}
};

Time podne(12), ponoc, petdo12(11,55);

Inicijalizacija objekata KONSTRUKTORI


Podrazumijevane vrijednosti mogu
da se navedu u prototipu
konstruktora tada se ne navode u
definiciji konstruktora!
Primjer:
class Time
{
private:
int hh, mm, ss;
public:
...
Time(int=0, int=0, int=0);
...
};
...
Time::Time(int h, int m, int s)
{
hh=h; mm=m; ss=s;
}

Podrazumijevane vrijednosti mogu


da se navedu u definiciji
konstruktora tada se ne navode u
prototipu konstruktora!
Primjer:
class Time
{
private:
int hh, mm, ss;
public:
...
Time(int, int, int);
...
};
...
Time::Time(int h=0, int m=0, int s=0)
{
hh=h; mm=m; ss=s;
}

Nije dozvoljeno podrazumijevane vrijednosti navoditi i u prototipu i


u definiciji konstruktora (isto vai i za ostale funkcije lanice!)!

DESTRUKTORI

Destruktori slino konstruktoru jo jedna specijalna funkcija lanica


klase

Destruktor se poziva svaki put kad se unitava neki objekat.

Destruktor sutinski ne unitava objekat (objekat e biti uniten i u


sluaju da klasa nema definisan destruktor) - destruktor slui za ienje
memorije (bitno kod objekata koji dinamiki alociraju memoriju).

Klasa moe da ima samo jedan destruktor. Nije dozvoljeno preklapanje


imena.

Destruktor nema argumenata! Destruktor nema tip!

Destruktor ima isto ime kao konstruktor, ali se ispred stavlja


tilda (~). Intuitivno se moe napraviti analogija sa bitskim operatorom negacije,
jer se destruktor ponaa
kao komplement
konstruktora.
class
Time
{
public:
...
~Time();
...
};

Redoslijed konstruktora i destruktora


Konstruktori i destruktori se pozivaju automatski.
Redoslijed kojim se pozivaju ove funkcije zavisi od redoslijeda kojim se ulazi
i izlazi iz domena u kojem se objekti kreiraju. Generalno, destruktori se
pozivaju obrnutim redoslijedom u odnosu na poziv konstruktora.
Za globalne objekte:

Konstruktor se poziva prije bilo koje funkcije (i prije main funkcije) tj.
prije poetka izvravanja programa. (u sluaju vie fajlova, redoslijed
izvravanja konstruktora nije unaprijed poznat!)

Destruktor se poziva nakon zavretka izvravanja main().

Za lokalne i automatske objekte:

Konstruktor se poziva u trenutku kad se objekat definie.

Destruktor se poziva u trenutku naputanja bloka u kojem je objekat


definisan.

Za statike objekte:

Konstruktor se poziva samo jednom - prilikom definisanja objekta.

Destruktor se poziva samo nakon zavretka izvravanja funkcije main.

Redoslijed konstruktora i destruktora


#include <iostream>
using namespace std;
class KD
{
public:
KD(int x)
{
data = x;
cout << "Konst " << data;
}
~KD() { cout<<"Dest "<<data<<endl; }
private:
int data;
};
void create( void )
{
KD kd5(5);
cout << " (create lokalni)" << endl;
static KD kd6(6);
cout << " (create staticki)" << endl;
KD kd7(7);
cout << " (create lokalni)" << endl;
}
KD kd1(1); // globalni objekat

int main()
{
cout <<" (ulaz u main)<< endl;
KD kd2(2);
cout <<" (main: lokalni)<<endl;
static KD kd3(3);
cout <<" (main: staticki)<<endl;
create();
KD kd4(4);
cout <<" (main: lokalni)<<endl;
cout <<"Izlaz iz programa<<endl;
}
Konst 1 (ulaz u main)
Konst 2 (main: lokalni)
Konst 3 (main: staticki)
Konst 5 (create lokalni)
Konst 6 (create staticki)
Konst 7 (create lokalni)
Dest 7
Dest 5
Konst 4 (main: lokalni)
Izlaz iz programa
Dest 4
Dest 2
Dest 6
Dest 3
Dest 1

string
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main()
{
string str1("Banja Luka"), str2;
cout << str1 << endl;
cout << " size: " << str1.size() << endl;
cout << " length: " << str1.length()
<< endl;
cout << " max_size: "
<< str1.max_size() << endl;

str1.replace(1, 4, ".");
cout << "Nakon zamjene: " << str1 << endl;
str1.insert(4, ".");
str1.erase(5, 3);
cout << "Novi string: " << str1 << endl;
cout << "Podstring: " << str2.substr(6, 4);
char *p = new char[str2.size() + 1];
strcpy(p, str2.c_str());
cout << endl << "c_str: " << p;
delete [] p;
return 0;
}

cout << "Unesite string: ";


cin >> str2;
cout << "Unijeli ste: " << str2 << endl;
str2.assign("Banja"); // str2 = "Banja";
str2.push_back(' ');
str2.append("Luka");
cout << "Novi string: " << str2 << endl;
cout << "Stringovi "
<< (str1.compare(str2)==0 ? "su" : "nisu")
<< " jednaki" << endl;
cout << "Znak(6): " << str1.at(6) << endl << endl;

Banja Luka
size: 10
length: 10
max_size: 1073741820
Unesite string: Doboj
Unijeli ste: Doboj
Novi string: Banja Luka
Stringovi su jednaki
Znak(6): L
Nakon zamjene: B. Luka
Novi string: B. L.
Podstring: Luka
c_str: Banja Luka

You might also like