Professional Documents
Culture Documents
C++
mr. sc. Jasminka Tomljanović, viši predavač
Veleučilište u Rijeci
J. Tomljanović: Programiranje
Julijan Šribar, Boris Motik: Demistificirani C++
T. Čukman, V. Bolt: C/C++, Procon, Zagreb, 1994.
Bruce Eckel: Thinking in C++, Second Edition, Prentice
Hall, 2000.
Borland C++ Vodić za profesionalne programere,
Bruneau Babet, Znak, Zagreb, 1995.
Porijeklo C++
CPU
memorijski
kontroler
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 11
Veleučilište u Rijeci
Objektna orijentacija
imitacija objekti
grafičke
kartice ove “iglice” predstavljaju
(kôd i podatci) javne interfejse objekata
imitacija
CPU-a
(kôd i podatci)
imitacija
memorije
(kôd i podatci)
Analogija s hardverom:
možemo poslati opću naredbu print a da ne znamo
ni proizvođača niti model pisača, te ako svi poštuju
isti protokol za komunikaciju morala bi naredba
print pokrenuti ispisivanje
Hoćemo da naredba izvrši: ispisivanje dokumenta
Na naredbu će matrični pisač reagirati drukčije od
laserskog
Iskoristivost i nesljeđivanje
Sadržaj
#include<iostream.>
int main()
{
std::cout<<"Velicina tipa int je: \t\t"<<sizeof(int)<<" bajta. \n";
std::cout<<"Velicina tipa short int je: \t"<<sizeof(short)<<" bajta. \n";
std::cout<<"Velicina tipa long int je: \t"<<sizeof(long)<<" bajta. \n";
std::cout<<"Velicina tipa char je: \t\t"<<sizeof(char)<<" bajta. \n";
std::cout<<"Velicina tipa float je: \t"<<sizeof(float)<<" bajta. \n";
std::cout<<"Velicina tipa double je: \t"<<sizeof(double)<<" bajta. \n";
return 0;
}
Dvodimenzionalna polja
Nizovi znakova
Operacije i funkcije sa znakovima se većinom nalaze u header datoteci
string.h
Znakovni nizovi su skupina znakova koji su raspoređeni unutar elemenata
nekog znakovnog polja
npr.: char kolegij[12+1]=“PROGRAMIRANJE”
P R O G R A M I R A N J E \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13
tj.: kolegij[0]=“P”
kolegij[1]=“R”
kolegij[2]=“O”
…
kolegij[12]=“E”
kolegij[13]=“\0”
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 27
Veleučilište u Rijeci
Sadržaj
Tipovi podataka
Varijable
Konstante
Vanjski opisi i definicije
Eksplicitne konverzije podataka
Formatirani ispis
Tipovi podataka
Osnovni:
cjelobrojni
realni
s pokretnom točkom (floating point)
znakovni
enumeracijski
prazan (void)
veličina izražena u broju byte-ova koje
zauzimaju u memoriji
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 31
Veleučilište u Rijeci
sizeof(float)<=sizeof(double)<=sizeof(long double)
sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
Granične vrijednosti:
za cijelobrojne vrijednosti: #include<limits.h>
INT_MIN,INT_MAX,LONG_MIN,LONG_MAX,...
za realne vrijednosti: #include<float.h>
FLT_MIN,FLT_MAX,...
Logički tip koristi vrijednosti true i false
Logička konstanta false=0,
bilo koja druga vrijednost=true
konverzija true u cjelobrojnu vrijednost=1
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 32
Veleučilište u Rijeci
Varijable
globalna: opisana izvan svih blokova i
definirana u cijelom programu
lokalna: definirana unutar bloka
globalne i lokalne varijable su vidljive u skladu
s definicijom sve dok ih ne zakloni u
umetnutom bloku lokalna varijabla istog imena
:: (scope resolution operator – dvostruka
dvotočka; operator za određivanje područja)
omogućuje uporabu globalne varijable kad je
“zaklanja” lokalna varijabla istog imena
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 33
Veleučilište u Rijeci
#include <iostream>
int a=0; //globalna varijabla
void main()
{
int a=1; //lokalna varijabla
{
int a=2; //lokalna varijabla
cout<<a<<endl; //ispisuje vrijednost lokalne varijabla a: 2
cout <<::a<<endl; //ispisuje vrijednost globalne varijabla a: 0
}
cout<<a<<endl; //ispisuje vrijednost lokalne varijabla a: 1
cout<<::a<<endl; //ispisuje vrijednost globalne varijabla a: 0
}12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 34
Veleučilište u Rijeci
2
0
1
0
Press any key to continue . . .
Konstante
brojac1= 3
Press any key to continue . . .
Formatirani ispis
#include <iostream>
using namespace std;
void main()
{
cout.width(20); //širina ispisa
cout.precision(6); //broj decimala
cout.fill('*'); //popunjava znakom * nepopunjena mjesta
cout.setf(ios::fixed | ios::right); //ispis s fiksnim zarezom i
//desnim poravnanjem
cout<<123.456<<111.1111<<endl;
cout<<222.222<<endl;
}
**********123.456000111.111100
222.222000
Press any key to continue . . .
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int c1=100, c2=960;
cout<<setw(10)<<"PROIZVOD"<<setw(12)<<"CIJENA"<<endl
<<setw(10)<<"Lopta"<<setw(12)<<c1<<endl
<<setw(10)<<"Tenisice"<<setw(12)<<c2<<endl;
}
PROIZVOD CIJENA
Lopta 100
Tenisice 960
Press any key to continue . . .
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
const double pi=3.141596;
cout<<"pi="<<setiosflags(ios::fixed)<<setw(15)<<setprecision(8)<<pi<<endl;
}
pi= 3.14159600
Press any key to continue . . .
#include<iostream>
using namespace std;
void main()
{
int i=11, j=17, k=25;
cout<<i<<"\t"<<j<<"\t"<<k<<endl;
cout<<oct<<i<<"\t"<<j<<"\t"<<k<<endl;
cout<<hex<<i<<"\t"<<j<<"\t"<<k<<endl;
}
11 17 25
13 21 31
b 11 19
Press any key to continue . . .
#include<iostream>
using namespace std;
void main()
{
int i, j, k, m;
cout<<"Upisite 4 cijela broja: ";
cin>>i>>oct>>j>>hex>>k>>dec>>m;
cout<<i<<"\t"<<j<<"\t"<<k<<"\t"<<m<<endl;
}
Sadržaj
Funkcije
Main () Func1
<povratni tip ili void> ime_funkcije (<tip> par1, <tip> par2, ...
,<tip> par N)
{
.
<blok instrukcija>
.
return <povratna vrijednost>; // izostavlja se ako je funkcija
tipa void
}
float Convert(float);
int main(){
float TempFar;
float TempCel;
cout<<"\nMolim Vas unesite temperaturu u Farenhajtima: ";
cin>>TempFar;
TempCel=Convert(TempFar);
cout<<"\nEvo temperature u Celzijusima: ";
cout<<TempCel<<endl;
return 0; }
float Convert(float TempFar)
{
float TempCel;
TempCel=((TempFar - 32)*5)/9;
return TempCel;
mr. sc. Jasminka Tomljanović, viši predavač
}
Lokalne i globalne varijable
Lokalne varijable su one varijable koje su
definirane samo u funkciji i izvan nje nisu
definirane
x iz main: 5
y iz main: 7
x iz myfunction: 5
y iz myFunction: 10
Povratak iz myFunction!
x iz main: 5
y iz main: 7
Press any key to continue
67
Argumenti funkcije
Povratak iz udvostrucivaca...
Povratak iz udvostrucivaca...
int Double(int a)
{
return 2*a;
Upisi broj: 8
Rezultat je: 16
Rezultat je: 32
Rezultat je: 64
Press any key to continue
Veleučilište u Rijeci
Referencni parametri
Parametri se predaju f-ji:
po referenci (by reference) – radi neposredno s
varijablom kao
stvarnim parametrom
– predaje se adresa
stvarnog parametra (&)
po vrijednosti (by value) – radi s kopijom
vrijednosti varijable
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 82
Referenca u listi argumenata funkcije
takvi argumenti se ne alociraju se na stogu nego dijele memorijski
prostor sa stvarnim argumentom
stvarni argumenti po povratku iz funkcije poprime vrijednosti
odgovarajućih formalnih argumenata
Primjer: reference
Primjer:
void funkcija_stat () { Inicijalizacija statičke varijable vrijedi
int a=777; samo za prvi poziv funkcije!
static int b=777;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
a = 7; b = 70;};
int main () {
cout << "1. poziv funkcije :" << endl;
funkcija_stat();
cout << "2. poziv funkcije :" << endl;
funkcija_stat();
return 1;}
mr. sc. Jasminka Tomljanović, viši predavač 84
Rekurzije
je svojstvo potprograma da može pozivati sam sebe.
Rekurzija može biti direktna ili indirektna
Direktna je kada funkcija poziva drugu funkciju
Indirektna je kada funkcija poziva drugu funkciju koja
poziva prvu funkciju
Problemi u kojem se postupak primijenjen nad
podacima primjenjuje i s rezultatom, te se to ponavlja
do prekida definiranog postavljenim uvjetom rješava
se rekurzijom
Zaključujemo problem rješavamo rekurzijom kada je u
samoj definiciji problema rekurzija
mr. sc. Jasminka Tomljanović, viši predavač
Kada funkcija poziva samu sebe izvršava se njena
nova kopija. Lokalne varijable u drugoj kopiji su
nezavisne od lokalnih varijabli u prvoj. Ne utječu jedne
na druge više nego lokalne varijable u main() na
lokalne varijable u bilo kojoj funkciji koju ona poziva.
PUSH A,5 PUSH B,4 PUSH B,3 PUSH B,2 PUSH B,1
A B B B B
#include <iostream>
using namespace std;
float zbroj(float a, float b){
return a+b;
};
int main(){
cout << zbroj(3,5) << endl;
cout << (int)zbroj << endl; // adresa funkcije
return 1;
}
Sadržaj
Pokazivači
Pokazivači
Osnove pokazivača
Reference
Sadržaj
Pokazivači na pokazivače
Prvo
Drugo
**polje
0 1 2 br_el_retka-1
0 polje[0] polje[0][0]
=stupac ....
polje[0][stupac]
polje
1 polje[1]
polje[1][0] polje[1][stupac]
=stupac ...
2 polje[2]
...
0 1 2 br_el_retka-1
br_redaka-1 polje[n-1] polje[n-1][0]= polje[n-1[stupac]
stupac ...
Zadatak
#include<iostream>
using namespace std;
}
while(ZADATAK[i][j]<2||ZADATAK[i][j]>5);
suma+=ZADATAK[i][j];
}
ZADATAK[i][j]=suma/ZADATAK[i][0];
}
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 113
}
Veleučilište u Rijeci
void main()
{
int n;
cout<<"Unesite broj studenata:";
cin>>n;
float **ZADATAK=new float*[n]; //stvara se niz od n pokazivača na tip float
cout<<endl;
stvori(ZADATAK,n);
cout<<endl;
ucitaj(ZADATAK,n);
cout<<endl;
ispis(ZADATAK,n);
cout<<endl;
dealokacija(ZADATAK,n);
}
1. student 1. ocjena:3
1. student 2. ocjena:4
1. student 3. ocjena:5
1. student 4. ocjena:2
2. student 1. ocjena:3
2. student 2. ocjena:3
2. student 3. ocjena:3
2. student 4. ocjena:4
2. student 5. ocjena:4
3. student 1. ocjena:5
3. student 2. ocjena:2
3. student 3. ocjena:3
4 3 4 5 2 3.5
5 3 3 3 4 4 3.4
3 5 2 3 3.33333
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 116
Press any key to continue . . .
Veleučilište u Rijeci
Sadržaj
Zapisi (strukture)
Zapis
Deklaracija zapisa
struct identifikator {
deklaracija komponente_1;
deklaracija komponente_2;
…
Deklaracija komponente_N;
} identifikator;
Primjer
struct student {
long int mat_br;
char prez_ime[35];
char adresa[40];
double pros_ocj;
}stud;
Komponente zapisa
stud.mat_br;
stud.prez_ime;
stud.adresa;
stud.pros_ocj;
Primjer
#include <iostream>
using namespace std;
int main () {
int O=1, B=0, S=0;
struct student {
int mat_br;
char prez_ime[35];
char adresa[40];
double pros_ocj;
} stud;
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 123
Veleučilište u Rijeci
stud.pros_ocj=(float)S/B;
cout << "Student: " << stud.mat_br << " " <<
stud.prez_ime << endl;
cout<<" Adresa: "<<stud.adresa<<endl;
cout<<" Prosjek: " << stud.pros_ocj << endl;
system("pause");
return 0;
}
Neimenovani zapis
struct student{
long int mat_br;
char prez_ime[35];
char adresa[40];
double pros_ocj;
};
int main(){
student stud;
…
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 129
Veleučilište u Rijeci
Sadržaj
Vezane liste
Vezana lista
Vezana lista je oblik dinamičkog čuvanja
podataka čiji broj elemenata nije unaprijed
poznat. Predstavlja skup elemenata povezanih
pokazivačima u:
jednom smjeru => jednostavna vezana lista
u dva smjera => dvostruko vezana lista
Temelji se na uporabi struktura (zapisa,
slogova) i pokazivača tj. osnovni element liste
je struktura koja sadrži pokazivač na slijedeći
element.
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 131
Veleučilište u Rijeci
(glava_liste)
pocetak_liste
podatak podatak podatak
slijedeci slijedeci
... NULL
Podatkovni sadržaj glave liste nije bitan jer je glava samo pomoćni element
liste!
pocetak_liste
NULL
novi=new element_liste;
novi *novi
?
?
novi *novi
Prvi
NULL
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 136
Veleučilište u Rijeci
novi *novi
Prvi
NULL
pocetak_liste
Prvi
NULL
pocetak_liste
Prvi
NULL
novi *novi
Drugi
pocetak_liste
Prvi
NULL
{
element_liste *pocetak_liste,*novi;
pocetak_liste=NULL;
cout<<"Upisite sadrzaj liste:"<<endl;
novi=new element_liste;
cin.getline(novi->podatak,10);
while(strcmp(novi->podatak,"")!=0)
{
novi->slijedeci=pocetak_liste;
pocetak_liste=novi;
novi=new element_liste;
cin.getline(novi->podatak,10);
}
cout<<"Sadrzaj liste je:\n";
pisi(pocetak_liste);
}
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 144
Veleučilište u Rijeci
NULL
podatkovni dio liste
glava
struct student{
int mat_br;
char prez_ime[35];
int god_stu;
student *slijedeci;
};
};
kraj liste
lista -> slijedeci = NULL;
NULL
NULL
lista zadnji novi
student *novi,*zadnji;
zadnji = lista;
while (zadnji->slijedeci) traženje zadnjeg elementa u listi
zadnji = zadnji->slijedeci;
cout << "Maticni broj: "; cin >> novi -> mat_br; upis
cout << "Prezime i ime: "; cin >> novi -> prez_ime; podatkovnog
cout << "Godina studija: "; cin >> novi -> god_stu; sadržaja
while (tekuci){
if (tekuci -> mat_br == mat_br){
cout << "Maticni broj: " << tekuci -> mat_br << endl;
cout << "Prezime i ime: " << tekuci -> prez_ime << endl;
cout << "Godina studija: " << tekuci -> god_stu << endl;
cout << "---------------------" << endl;
break; // izlaz iz petlje za pretraživanje
};
tekuci = tekuci -> slijedeci;
};
NULL
mat_br=X
while (brisi) {
if (brisi -> mat_br == mat_br){
prethodni -> slijedeci = brisi -> slijedeci;
delete brisi;
break; // izlaz iz petlje
};
prethodni = brisi;
brisi = brisi->slijedeci;
};
mr. sc. Jasminka Tomljanović, viši predavač 158
Sortiranje vezane liste (bubble sort; prema
matičnom broju uzlazno):
1 2
NULL
5 3 6
lista,
tekuci slijedeci
prethodni
lista=dealokacija_liste(lista);
Sadržaj
Datoteke
d.open(“prva.dat”,ios::in|ios::binary)
Datotečnom objektu d pridružena je stvarna
datoteka prva .dat
Datoteka je otvorena za čitanje u binarnom
načinu
Datotečni pokazivač
datotečni pokazivač sadrži poziciju unutar datoteke gdje se
može obaviti operacija čitanja ili upisa u datoteku
pozicija je izražena u cijelom broju bajtova od početka datoteke
do mjesta upisa/čitanja
C++ razlikuje datotečni pokazivač za čitanje datoteke od
datotečnog pokazivača za upis u datoteku
Funkcije za očitavanje vrijednosti datotečnog pokazivača (tipa tell):
tellg() - vrijednost pokazivača za čitanje datoteke
tellp() - vrijednost pokazivača za upis u datoteku
Sintaksa:
int vrijednost = <datotečni objekt>.{tellg ili tellp}();
Primjer 1:
d.open (“prva.dat", ios::in);
//otvaranje datoteke za čitanje
cout << d.tellg() << endl;
//0 -vrijednost dat. pokazivača za čitanje
Npr.:
d.open ("d.dat", ios::out);
//otvaranje dat. za upis podataka
cout << d.tellp() << endl;
//0 -vrijednost dat. pokazivača za upis
otvaranjem datoteke u modu out datotečni
pokazivač za upis postavlja se na početak
datoteke.
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 174
Veleučilište u Rijeci
Npr.:
d.open ("d.dat", ios::in);
// otvaranje datoteke za čitanje
d.seekg (5* sizeof(slog));
// postavlja datotečni pokazivač za čitanje
// na slog s rednim brojem 5
Mod in
koristi se za otvaranje datoteke za čitanje
otvara postojeću datoteku, a datotečni
pokazivač za čitanje se postavlja na 0
(početak datoteke)
ako datoteka sa zadanim stvarnim imenom
ne postoji na disku, otvaranje ne uspijeva,
što se može provjeriti stanjem datotečnog
objekta:
d.open(“prva.dat",ios::in);
if (!d)
cout << "Otvaranje nije uspjelo, datoteka ne
postoji na disku!" << endl;
else
cout << "Datoteka je otvorena!" << endl;
Mod out
koristi se za otvaranje datoteke za upis podataka
datotečni pokazivač za upis se postavlja na 0
(početak datoteke)
stvara se nova datoteka na disku ili se postojeća briše
može se kombinirati s nocreate:
d.open(“prva.dat",ios::out | ios::nocreate);
//ne dozvoljava brisanje postojeće datoteke
Mod noreplace
Datoteka neće biti otvorena , ako već postoji na
disku:
d.open(“prva.dat",ios::out | ios::noreplace);
Mod trunc
d.open(“prva.dat",ios::out | ios::trunc);
d.open(“prva.dat",ios::app);
// otvara datoteku za dodavanje novih zapisa
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 184
Veleučilište u Rijeci
Mod binary
otvara datoteku u binarnom načinu rada
nema konverzija kod upisa/čitanja podataka kao
kod tekstualnog načina rada (bitovni sadržaj ostaje
nepromijenjen)
dat.open ("datoteka.dat",ios::in|ios::binary);
//otvara ulaznu datoteku u binarnom modu
Binarni način rada koristi se kod datoteka s fiksnom
veličinom sloga jer bi svaka eventualna konverzija
mogla sadržaj zapisa učiniti nečitljivim.
Tekstualna datoteka
Tekstualne datoteke sastoje se od podataka znakovnog tipa
(redova teksta)
svaki red završava kontrolnim znakovima
CR (Carriage Return; ASCII kod 13; prebacuje kursor na
početak reda) i
LF (Line Feed; ASCII kod 10; pomiče kursor u slijedeći
red)
zajedno, CR i LF čine znak EOLN - znak za kraj reda
da bi pročitali/upisali neki podatak, moramo
najprije pročitati/upisati sve prethodne
#include <iostream>
#include <fstream>
using namespace std;
int main(){
char red[80];
fstream d;
d.open("C:\\DATOTEKE\\tekst.txt",ios::in);
while(d){
d.getline (red,sizeof(red),'\n'); //čitanje reda iz datoteke
cout << red << endl; // ispis na ekran
};
d.close();
return 0;}
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 191
Veleučilište u Rijeci
#include <iostream>
#include <fstream>
void kreiranje_datoteke()
{
fstream datoteka; // datotečni objekt
cout<<"Unesite naziv datoteke u koju cete spremati podatke: ";
cin>>naziv_datoteke;
cout<<"Maticni broj:"<<"\t"<<s.mat_br<<endl;
cout<<"Prezime i ime:"<<"\t"<<s.prez_ime<<endl;
cout<<"Godina upisa:"<<"\t"<<s.g_upisa<<endl;
cout<<"----"<<endl;
} while (!datoteka.eof());
datoteka.close ();
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 201
}
Veleučilište u Rijeci
void main()
{
kreiranje_datoteke ();
unos_podataka_u_datoteku ();
ispis_podataka_o_svim_studentima ();
}
Upisite podatke:
Maticni broj: 1
Prezime i ime: Ivo Ivic
Godina upisa: 2006
Dalje (d/n)? d
Maticni broj: 5
Prezime i ime: Ana Anic
Godina upisa: 2007
Dalje (d/n)? n
Sadržaj
Klase i objekti
Konstruktori i destruktori
Deklaracija klase
deklaracija struct naslijeđena je iz C-a i definira
isključivo atribute
deklaracija class u C++ definira atribute i
metode (potpune objekte)
deklaracija class uvodi specifikatore pristupa
koji određuju prava pristupa članovima klase a to su:
public
protected
private
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 206
Veleučilište u Rijeci
class
private
nevidljivo iz dijelova
atributi
programa van klase metode
public
vidljivo iz dijelova atributi
programa van klase metode
Primjer klase
class pravokutnik {
public: int x1,y1,x2,y2; //javni članovi klase dostupni izvan klase
private: int sirina, visina; //privatni članovi dostupni unutar klase
public:
int povrsina (){ //javni član klase
visina = y2 – y1; //pristup privatnim članovima klase
sirina = x2 – x1;
return sirina * visina;
} //povrsina
}; //pravokutnik
Atributi i metode
class klasa{
public: int atribut;
void metoda(){
cout << "metoda" << endl;
} //metoda
}; //klasa
klasa objekt1,objekt2;
int main(){
cout << sizeof(objekt1) << endl; // 4 ( =sizeof(int) )
objekt1.atribut=11;
memcpy (&objekt2,&objekt1,sizeof(klasa)); //kopiranje objekta
cout << objekt2.atribut << endl;
return 1;
} //main
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 212
Veleučilište u Rijeci
Enkapsulacija
Pokazivač this
iz jedne klase moguće je definirati neograničen
broj objekata
klasa “ne zna” nazive svojih objekata
pomoću pokazivača this moguće je unutar
klase doznati adresu objekta, odnosno:
*this predstavlja sam taj objekt na način kako
je dostupan iz koda klase
u većini slučajeva nije neophodno navoditi
pokazivač this: this -> x skraćeno se piše x
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 215
Veleučilište u Rijeci
class klasa{
public: int a,b;
void metoda(){
cout << "Adresa objekta preko kojeg je metoda pozvana:"<<(int)this <<endl;
cout<<"Vrijednosti atributa su: "<<this->a<<" i "<<this->b<< endl;
} //metoda
}; //klasa
klasa objekt1,objekt2;
void main(){
objekt1.a=11; objekt1.b=15;
cout << "Adresa objekta objekt1: " << (int)&objekt1 << endl;
objekt1.metoda();
objekt2.a=22; objekt2.b=25;
cout << "Adresa objekta objekt2: " << (int)&objekt2 << endl;
objekt2.metoda();
}12.1.2020.
//main 216
mr. sc. Jasminka Tomljanović, viši predavač
Veleučilište u Rijeci
Operator ::
Operator :: naziva se operator dodjele
područja ili operator pripadnosti
pripadnost se odnosi na klasu ili područje
imena (namespace)
#include<iostream>
int a; // globalna varijabla a
class klasa{
public: int a,b;
static int c; // vrijednost c se dijeli između svih objekata klase
enum {pon,uto,sri,cet,pet,sub,ned}; // pobrojenje
void metoda(); //prototip metode
}; //klasa
void klasa::metoda(){ //metoda pripada klasi klasa
std::cout << "Metoda izvan tijela klase" << std::endl;
} //metoda
klasa objekt1,objekt2;
int klasa::c=5; //ne pripada svakom objektu pojedinačno
int main(){
objekt1.metoda(); // kod poziva nema razlike
char a; // lokalna varijabla a koja prekriva istoimenu globalnu var.
a = 'A'; // podrazumijeva se lokalna varijabla
::a=11; // ovo je globalna varijabla a
std::cout << klasa::ned << std::endl; //pristup članu pobrojenja
std::cout << klasa::c << std::endl;
klasa::c=22;
std::cout << objekt1.c << std::endl;
std::cout << objekt2.c << std::endl;
} //main
Konstruktor
Destruktor
destruktor ima isto ime kao i klasa samo što
ispred imena klase dolazi znak ~ (tilda). Poziva
se automatski kod dealokacije objekta.
Specifičnosti destruktora u odnosu na ostale
metode:
Destruktor nema argumenata
Destruktor (isto kao i konstruktor) nema tip, ne vraća
vrijednost i ne nasljeđuje se
class pravokutnik {
public: int x1,y1,x2,y2;
private: int sirina, visina;
public:
pravokutnik(){ //konstruktor 1
cout << "Kostruktor (bez argumenata)!" << endl; };
pravokutnik(int x1_,int y1_,int x2_,int y2_){ //konstruktor 2
cout << "Konstruktor (s argumentima):" << endl;
x1=x1_;y1=y1_;x2=x2_;y2=y2_; };
~pravokutnik(){ //destruktor
cout << "Destruktor!" << endl;
}; //~pravokutnik
int povrsina (){ //povrsina
visina = y2 - y1;
sirina = x2 - x1;
return sirina * visina;}; //povrsina
}; //pravokutnik
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 225
Veleučilište u Rijeci
pravokutnik p2,*objekt;
int main(){
objekt = new pravokutnik; //alokacija objekta
delete objekt; //dealokacija objekta
pravokutnik p2(50,50,100,150); //pokreće 2. konstruktor
cout << "Povrsina p2=" << p2.povrsina() << endl;
objekt = new pravokutnik(20,20,50,60); //alokacija objekta
cout << "Povrsina objekta=" << objekt->povrsina() << endl;
delete objekt; //dealokacija objekta
}
Sadržaj
Definiranje klase
class student{
private: student *slijedeci; //pokazivač na slijedeći element liste
public:
//javni atributi – podatkovni sadržaj elementa liste
int mat_br;
char prez_ime[35];
int god_stu;
//metode – sve operacije za rad s vezanom listom
...
...
}; //class
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 229
Veleučilište u Rijeci
class student{
...
//metode – sve operacije za rad s vezanom listom
student(){ //konstruktor
slijedeci=NULL;
}; //konstruktor
...
}; //class
int main(){
lista=new student; //alokacija glave liste
} //main
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 230
Veleučilište u Rijeci
Poziv metode:
lista -> dodaj_element();
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 231
Veleučilište u Rijeci
Poziv metode:
lista->ispisi_sve_elemente(
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 232
Veleučilište u Rijeci
Poziv metode:
lista->pretrazi_listu(mat_br);
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 233
Veleučilište u Rijeci
Metoda za brisanje liste
void brisi_element(int mat_br){int nadjen=0;
student *brisi = this -> slijedeci, *prethodni = this;
while (brisi){
if (brisi -> mat_br == mat_br){
nadjen=1;
prethodni -> slijedeci = brisi -> slijedeci;
delete brisi; break; // izlaz iz petlje
}; // if
prethodni = brisi;
brisi = brisi->slijedeci;
}; // while
if (nadjen) cout << "Element je izbrisan iz liste!" << endl;
else cout << "Element nije pronadjen!" << endl;
}; //brisi element
Poziv metode:
lista->brisi_element(mat_br);
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 234
Veleučilište u Rijeci
Metoda za sortiranje liste uzlazno prema matičnom broju
void sortiraj_listu(){
student *prethodni,*tekuci,*slijedeci;
int indikator,brojac=0;
do{ indikator = 0;
tekuci=this->slijedeci;prethodni=this;
while (tekuci->slijedeci){
slijedeci=tekuci->slijedeci;
if (tekuci->mat_br > slijedeci->mat_br){
prethodni->slijedeci=slijedeci;
tekuci->slijedeci=slijedeci->slijedeci;
slijedeci->slijedeci=tekuci;
indikator=1;} //if
prethodni=tekuci;
tekuci=tekuci->slijedeci;} //while
} while (indikator==1);
}; // sortiraj listu
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 235
Poziv metode: lista-> sortiraj_listu();
Veleučilište u Rijeci
Metoda za dealokaciju liste
Poziv metode:
lista=lista->dealokacija_liste();
12.1.2020. mr. sc. Jasminka Tomljanović, viši predavač 236
Veleučilište u Rijeci
Prijatelj klase
Prijatelj klase predstavlja izuzetak od pravila da
privatnim članovima klase mogu pristupati
isključivo metode iste klase.
Pojedina klasa može dodijeliti nekoj funkciji,
metodi neke klase ili čitavoj klasi pravo pristupa
vlastitim privatnim i zaštićenim članovima.
Takve funkcije, metode i klase nazivaju se
prijatelji klase, a označavamo ih pomoću ključne
riječi friend.
“prijateljstvo” klasa
12.1.2020. nije obostrano! 237
mr. sc. Jasminka Tomljanović, viši predavač
Veleučilište u Rijeci
class osnovna{
private:
void privatna(){ // prijatelji klase mogu pozivati ovu metodu
cout << "Privatni funkcijski clan!" << endl;
};
};
Nasljeđivanje
Nasljeđivanje je postupak kojim se iz postojeće
klase izvodi nova, tako da ta nova klasa:
zadržava (tj. nasljeđuje) sve atribute i metode
osnovne klase (osim privatnih)
implementacija metoda može se promijeniti
nova klasa može uključivati i druge članove, osim
naslijeđenih (polimorfizam)
moguće je da jedna klasa naslijedi više osnovnih
klasa (višestruko nasljeđivanje)
vozilo
godiste,tezina,
snaga_motora,
max_brzina
ispis()
ispis() ispis()
Tipovi nasljeđivanja
Prava pristupa naslijeđenim članovima klasa mogu i
ne moraju biti ista kao u osnovnoj klasi, što je
određeno tipom nasljeđivanja:
javno nasljeđivanje (public) određuje da će svi
atributi i metode osnovne klase imati ista prava
pristupa iz izvedene klase kao i iz osnovne klase.
zaštićeno nasljeđivanje (protected) određuje da će
naslijeđeni članovi osnovne klase biti dostupni iz
izvedene klase, ali s najvišim pravom pristupa
protected (tj. svi javni članovi osnovne klase postat
će zaštićeni u izvedenoj).
osnovna
izv_public izv_protected
izv_private
Višestruko nasljeđivanje
klasa_prva klasa_druga
void ispis(kilometraza,
int kilometraza, godina godina)
klasa_izvedena
void ispis()
Primjer: Vozila
različita vozila (npr. automobili, autobusi i kamioni)
predstavljaju objekte iz različitih klasa s jednom
osnovnom klasom koju nasljeđuju (vozilo)
zadana struktura podataka (ovdje vezana lista) sadrži
objekte iz sve tri klase
da li je moguće prijeći cijelu strukturu (ovdje vezanu
listu) pomoću istog pokazivača (npr. iz klase vozilo)?
ako svaka od klasa koje se odnose na vozila definira
vlastitu metodu za ispis podataka, da li je moguće
preko pokazivača iz klase vozilo pozvati odgovarajuću,
tako da se ispišu podaci za odgovarajuću vrstu vozila?
12.1.2020. //kasno povezivanje249
mr. sc. Jasminka Tomljanović, viši predavač
Veleučilište u Rijeci
Apstraktna klasa
Apstraktna klasa je klasa iz koje se ne može
instancirati objekt, nego služi samo kao osnova za
nasljeđivanje
da bi klasa bila apstraktna, mora sadržavati barem
jednu čistu virtualnu metodu
Primjer:
class apstraktna{
public:
int kilometraza,godina;
virtual void unos()=NULL; //čiste virtualne metode
virtual void ispis()=NULL;};
pokazivač na funkciju
12.1.2020.
dobiva vrijednost NULL
mr. sc. Jasminka Tomljanović, viši predavač 251
Veleučilište u Rijeci
Primjer:
class apstraktna{
public:
int kilometraza,godina;
virtual void unos()=NULL; //čiste virtualne metode
virtual void ispis()=NULL;};