02-Klase

Report
Klase






Definisanje i deklarisanje klasa
Objekti klasnih tipova
Metode klasa
Konstruktori i destruktori
Zajednički članovi klasa
Prijateljske funkcije i klase

Za filozofe
◦ Predmet klasifikacije ljudi
◦ Klasifikacija bazirana na zajedničkim osobinama i
ponašanju
◦ Dogovor o opisima i imenima korisnih klasa

Za programere
◦ Imenovana sintaksna konstrukcija koja opisuje
zajedničko ponašanje i svojstva
◦ Struktura podataka koja obuhvata i podatke i
funkcije


Objekat je primjerak (instanca) klase
Objekti posjeduju:
◦ Identitet (objekti iste klase se razlikuju jedan od
drugog)
◦ Ponašanje (objekti mogu da izvršavaju operacije)
◦ Stanje (objekti čuvaju podatke)

Apstrakcija – selektivno “ignorisanje”
◦
◦
◦
◦
Razdvajanje važnih od nevažnih stvari
Fokusiranje na ono što je važno
Ignorisanje onoga što je nevažno
Koristiti enkapsulaciju (zatvaranje) za primjenu
apstrakcije


Kombinovanje podataka i metoda (data and
methods) u jednoj “kapsuli”
Kontrola pristupa/vidljivosti


Zatvaranje podataka i metoda u isti kontejner
Granica kontejnera razdvaja unutrašnjost od
okoline
Withdraw( )
Withdraw( )
balance
balance
Deposit( )
Deposit( )
BankAccount ?
BankAccount ?


Metode su obično javne (public), dostupne
izvana
Podaci su obično privatni (private),
nedostupni izvana
Withdraw( )
balance
Deposit( )
BankAccount ?
Withdraw( )

balance
Deposit( )
BankAccount ?

Omogućava kontrolu
◦ Korišćenje objekta vrši
se samo posredstvom
javnih metoda

Omogućava izmjene
◦ Korišćenje objekta
izvana ostaje isto
u slučaju promjene
internih tipova
◦ podataka
Withdraw( )
Deposit( )

balance 12.56
Withdraw( )
Deposit( )
dollars 12
cents
56

Podaci objekata daju informacije o
individualnim objektima
◦ Svaki račun ima svoje stanje. Ako dva računa imaju
isto stanje, to je samo slučajnost.
Withdraw( )
Withdraw( )
Deposit( )
Deposit( )
balance 12.56
balance
owner
owner
"Bert"
12.56
"Fred"

Zajednički podaci daju informaciju o
svim objektima klase
◦ Svi računi imaju istu kamatnu stopu. Čuvanje
iste stope za svaki račun nije dobro rješenje.
Withdraw( )
Withdraw( )
Deposit( )
Deposit( )
balance 12.56
balance
interest 7%
interest 7%

99.12


Zajedničke metode pristupaju zajedničkim
podacima, pozivaju se za klasu, ne za objekat
The account class
InterestRate( )

interest 7%
Classes contain static
data and
static methods
An account object


Withdraw( )
Deposit( )
balance
owner
99.12
"Fred"
Objects contain object
data and
object methods





Složeni tipovi podataka
Elementi klasa – članovi (atributi, metode)
Podaci klasnog tipa – primjerci, instance
klase, objekti
Vrijednosti atributa čine stanje objekta
Metode služe za izvođenje operacija koje
objekat podržava





Određuju moguće vrijednosti objekata
Određuju moguće operacije nad objektima
Sprečavaju bilo koje druge operacije nad
objektima
Obezbjeđuju obaveznu inicijalizaciju objekata
Obezbjeđuju uništavanje objekata kada više
nisu potrebni




Definicija klase – navođenje svih članova
klase
Deklaracija klase – naznačavanje da neki
identifikator predstavlja klasu, bez detalja
implementacije
Definicija atributa – naredba za definisanje
podataka
Definicija metoda – definicija funkcija
class Time {
public:
Time();
void setTime( int, int, int );
void printUniversal();
void printStandard();
private:
int hour;
int minute;
int second;
};
class Time {
public Time() {...}
public void setTime(int x,int y,int z)
{...}
public printUniversal() {...}
private int hour;
private int minute;
private int second;
};
#include <iostream>
using namespace std;
int main () {
cout << "Hello World!";
return 0;
}
using System;
class Hello
{
public static int Main( )
{
Console.WriteLine("Hello, World");
return 0;
}
}



Naredba definisanja podataka, bez
mogućnosti navođenja inicijalizatora
Odjednom se može definisati više atributa
zajedničkog osnovnog tipa
Atributi ne mogu biti tipa klase koja se
upravo definiše, ali mogu biti pokazivači i
upućivači na primjerke te klase (C++)




Ekvivalentno definisanju funkcija
Za metode definisane u okviru klase
podrazumijeva se modifikator inline, tzv
ugrađene metode (C++)
Tumačenje tijela metode odlaže se do kraja
definicije klase, što omogućava korištenja
članova klase koji se definišu poslije definicije
metode u okviru klase
Povratna vrijednost i argumenti metode mogu
biti tipa klase koja se definiše



Prototip funkcije (potpis, signature)
Metode koje se u klasi deklarišu moraju biti
definisane izvan definicije klase (C++)
Mogu biti i ugrađene metode ali je tada
potrebno eksplicitno navesti modifikator
inline pri definisanju metode (C++)

Privatni
◦ Pristup samo iz unutrašnjosti klase
◦ Nevidljivi izvan klase

Javni
◦ Pristup iz unutrašnjosti i izvan klase


Atributi uglavnom privatni, metode i privatne
i javne
Pristup atributima pomoću javnih metoda




Doseg svih identifikatora unutar klase je od
mjesta definisanje do kraja klase
Članovi klase imaju klasni doseg
Definicija klase mora biti dostupna
prevodiocu pri prevođenju programa koji
stvara objekte te klase
Definicije klase obično se stavljaju u zaglavlja
(ime_klase.h) koja se uključuju u program
direktivama #include (C++)

Klasni doseg (class scope)
◦ Podaci članovi, funkcije članice

U okviru klasnog dosega članovi klase
◦ Direktno dostupni svim funkcijama članicama
◦ Referenciranje navođenjem imena

Van klasnog dosega
◦ Referenciranje na osnovu imena objekta, reference
objekta, pokazivača na objekat




Promjenljive deklarisane u funkciji članici poznate
samo u funkciji
Promjenljive sa istim imenom kao promjenljive u
dosegu klase
◦ Promenljive klasnog dosega se “sakrivaju maskiraju”
◦ Pristup je moguć korišćenjem operatora za
razrješenje dosega (scope resolution operator) (::)
ClassName::classVariableName (C++)
Promjenljive su poznate samo u funkcijama gdje su
definisane
Promjenljive se uništavaju nakon završetka funkcije
tj. izlaska iz nje


Lakše se modifikuju programi
Header fajlovi
◦ definicija klasa i prototipova funkcija
◦ uključuju se u svaki fajl koji koristi klasu
(#include)
◦ Ekstenzija fajla *.h

Fajlovi sa kodom
◦ Definicija funkcija
◦ Isto osnovno ime po konvenciji
◦ Kompajliraju se i poslije se linkuju
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Time {
Prototip funkcije koja je
public.
public:
Definicija klaseTijelo
počinje
klase počinje
Time();
constructor
ključnom rečjuotvorenom
class. //
vitičastom
void setTime( int, int, zagradom.
int ); // set hour, minute, second
void printUniversal();
// print
Modifikatori
pristupauniversal-time format
Konstruktor
ima istoprava
ime kao
void printStandard();
i klasa, Time, i nema// print standard-time format
povratnu vrijednost.
private:
private podaci kojima
int hour;
// 0 - mogu
23 (24-hour
da pristupeclock
samo format)
članice.
int minute;
// 0 - funkcije
59
Definicije
se
završavaju
završava sa
int second; Tijelo
//klase
0 -se59
tačka-zarez
tj ; zagradom.
desnom
vitičastom
}; // end class Time
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Declaration of class Time.
// Member functions are defined in time1.cpp
Pretprocesorska direktiva kao
zaštita od višestukog
// prevent multiple inclusions
of header file
uključivanja
#ifndef TIME1_H
#define TIME1_H
Code between
these directives
Naming
convention:
Preprocesorska
direktiva
not included
if name
ime
header fajla
sa TIME1_H
// Time abstract
data
type ime
definition
“If not
defined”
definiše
TIME1_H.
already defined.
underscore.
class Time {
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
private:
int hour;
int minute;
int second;
// 0 - 23 (24-hour clock format)
// 0 - 59
// 0 - 59
}; // end class Time
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Member-function definitions for class Time.
#include <iostream>
using std::cout;
#include <iomanip>
using std::setfill;
using std::setw;
Uključivanje header fajla
time1.h.
// include definition of class Time from time1.h
#include "time1.h"
// Time constructor initializes each
data
member
zero.
Ime
header
fajlato
u duplim
uglasti
// Ensures all Time objects start innavodnicima;
a consistent state.
navodnici se koriste za header
Time::Time()
fajlove iz C++ Standard
{
Library.
hour = minute = second = 0;
} // end Time constructor
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Set new Time value using universal time. Perform validity
// checks on the data values. Set invalid values to zero.
void Time::setTime( int h, int m, int s )
{
hour = ( h >= 0 && h < 24 ) ? h : 0;
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
} // end function setTime
// print Time in universal format
void Time::printUniversal()
{
cout << setfill( '0' ) << setw( 2 ) << hour << ":"
<< setw( 2 ) << minute << ":"
<< setw( 2 ) << second;
} // end function printUniversal
42
43
44
45
46
47
48
49
50
// print Time in standard format
void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
<< ":" << setfill( '0' ) << setw( 2 ) << minute
<< ":" << setw( 2 ) << second
<< ( hour < 12 ? " AM" : " PM" );
} // end function printStandard

Nakon definisanja klase moguće je
◦ Definisanje objekata i nizova objekata [ ]
◦ Definisanje pokazivača i upućivača na objekte
(C++)
◦ Dodjela vrijednosti jednog objekta drugom
◦ Nalaženje adresa objekata i pristup objektima na
osnovu adrese ili indeksiranjem (C++)
◦ Pristup članovima objekata neposredno (.)
◦ Pristup članovima objekata posredno (->) (C++)






Objekti klasnih tipova su primjerci ili instance
klase
Definišu se uobičajenim naredbama za
definisanje podataka
Za oznaku tipa uzima se identifikator klase
Za svaki objekat kreira se poseban skup svih
polja (atributa) te klase
Pripadanje metoda objektu treba shvatiti u
logičkom smislu: pri pozivu metode određenog
objekta ona obrađuje polja tog objekta
Pri prevođenju programa se prevod svake
metode smješta u memoriju samo jednom,
koristi se za poziv metode iz bilo kojeg objekta



Dodjela vrijednosti jednog objekta drugom
podrazumijeva kopiranje vrijednosti svih
polja izvorišnog u odredišni objekat
Za slučaj pokazivačkih polja prenosi se samo
vrijednost pokazivača, ne i pokazivani
podatak (podobjekat)
Pristup metodama operatorima “.” i “->”
podrazumijeva pozivanje metode



Objekti mogu biti parametri i povratne
vrijednosti funkcija
U slučaju parametara prenos se vrši po
vrijednosti
Moguće je koristiti i pokazivače ili upućivače
(C++)

Mogu se definisati izvan ili unutar klasa
(C++)
◦ Obično se definišu izvan klasa
◦ Inline metode – definisane unutar klasa

Definišu se unutar klasa (C#)

Koristi se binarni resolution operator “::”
◦ Određuje kojoj klasi pripada funkcija
◦ Jedinstveno identifikuje funkcije konkretne klase
◦ Različite klase mogu imati metode istih imena
ReturnType ClassName::MemberFunctionName( ){
…
}


Ne zavisi da li je funkcija private ili public
Za metode definisane unutar klase nije
potrebno navoditi operator “::” niti ime
klase


Koristi se ključna riječ inline ispred funkcije
Kompajler kopira kod funkcije umjesto poziva
funkcije
◦ Umanjuje broj poziva funkcije
◦ Kompajler može i da ignoriše inline

Korisno za male funkcije koje se često koriste
inline double cube( const double s )
{ return s * s * s; }
0
1
3
4
6
7
8
9
2
3
4
5
7
#include <iostream>
using std::cout;
using std::endl;
#include <iomanip>
using std::setfill;
Definicija klase Time.
using std::setw;
// Time abstract data type (ADT) definition
class Time {
public:
Time();
// constructor
void setTime( int, int, int ); // set hour, minute, second
void printUniversal();
// print universal-time format
void printStandard();
// print standard-time format
private:
int hour;
// 0 - 23 (24-hour clock format)
int minute;
// 0 - 59
int second;
// 0 - 59
}; // end class Time
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Time constructor initializes each
// ensures all Time objects start in
Time::Time()
{
hour = minute = second = 0;
data member to zero and
Constructor inicijalizuje
a consistent
private
podatakstate
na 0.
} // end Time constructor
// set new Time value using universal time, perform validity
public to
member
// checks on the data values and set invalid values
zero
function
proverava
void Time::setTime( int h, int m, int s )
vrednost parametara
{
pre setovanja
hour = ( h >= 0 && h < 24 ) ? h : 0;
private podataka.
minute = ( m >= 0 && m < 60 ) ? m : 0;
second = ( s >= 0 && s < 60 ) ? s : 0;
} // end function setTime
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// print Time in universal format
void Time::printUniversal()
{
cout << setfill( '0' ) << setw( 2 ) << hour << ":"
<< setw( 2 ) << minute << ":"
<< setw( 2 ) << second;
} // end function printUniversal
Nema argumenata.
// print Time in standard format
void Time::printStandard()
{
cout << ( ( hour == 0 || hour == 12 ) ? 12 : hour % 12 )
<< ":" << setfill( '0' ) << setw( 2 ) << minute
<< ":" << setw( 2 ) << second
<< ( hour < 12 ? " AM" : " PM" );
} // end function printStandard
int main()
{
Time t;
Deklaracija promenljive t
kao objekta klase Time.
// instantiate object t of class Time
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// output Time object t's initial values
cout << "The initial universal time is ";
t.printUniversal();
// 00:00:00
poziv public metode
cout << "\nThe initial standard time is ";
t.printStandard();
// 12:00:00 AM
t.setTime( 13, 27, 6 );
// change time
Postavljanje
vrednosti člana
// output Time object t's
new values
public is ";
cout << "\n\nUniversal klase
timekorišćenjem
after setTime
funckije
članice.
t.printUniversal();
//
13:27:06
cout << "\nStandard time after setTimePokušaj
is ";postavljanja
t.printStandard();
// 1:27:06 PM vrednosti člana klase na
t.setTime( 99, 99, 99 );
nevalidnu vrednost
korišćenjem
public
// attempt invalid
settings
funkcije članice.
// output t's values after specifying invalid values
cout << "\n\nAfter attempting invalid settings:"
<< "\nUniversal time: ";
t.printUniversal();
// 00:00:00
93
cout << "\nStandard time: ";
94
t.printStandard();
// 12:00:00 AM
95
cout << endl;
96
97
return 0;
98
99
} //universal
end main
The initial
time is 00:00:00
The initial standard time is 12:00:00 AM
Universal time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM
After attempting invalid settings:
Universal time: 00:00:00
Standard time: 12:00:00 AM
Podatak postavljen na 0
nakon pokušaja postavljanja
nevalidne vrednosti.
class BankAccount
{
public void Withdraw(decimal amount)
{ ... }
public void Deposit(decimal amount)
{ ... }
private decimal balance;
private string name;
}

Deklaracija varijable tipa klase ne kreira novi
objekat, potrebno je koristiti operator new
class Program
now hour
{
minute
static void Main( )
yours
new
{
...
... BankAccount
Time now;
object
now.hour = 11;
BankAccount yours = new BankAccount( );
yours.Deposit(999999M);
}
}

Operator this odnosi se na objekat koji se
koristi za pristup članu
class BankAccount
{
...
public void SetName(string name)
{
this.name = name;
}
private string name;
}






Specijalne funkcije članice klase
Imaju isto ime kao i klasa
Inicijalizuju podatke članove klase
Pozivaju se automatski kada se kreira objekat
klase
Nemaju povratni tip
Može se definisati više konstruktora sa istim
imenom, ali različitim brojem ili tipom
parametara (overloading)




Dodjeljuje se memorijski prostor i eventualno
inicijalizacija
Memorijski prostor se dodjeljuje automatski
za sva polja prema definiciji klase
Inicijalizaciju polja treba da obezbijedi
programer
Izuzetak su trajni (statički) objekti čije su
početne vrijednosti nule na memorijskim
lokacijama svih polja






Jedna klasa može imati više konstruktora - dozvoljeno
je preklapanje imena funkcija i za slučaj konstruktora
Konstruktori mogu imati proizvoljan broj parametara, a
mogu biti i bez parametara
Parametar konstruktora ne može biti tipa svoje klase, ali
može biti pokazivač ili upućivač na primjerke vlastite
klase (C++)
Konstruktori mogu imati i podrazumijevane parametre
(C++)
Ne vraćaju nikakvu vrijednost, pri definisanju nije
dozvoljena čak ni upotreba riječi void za oznaku tipa
Jedina razlika u definiciji konstruktora u odnosu na
definiciju obične funkcije klase je u nedostatku oznake
tipa



Pozivaju se automatski u trenutku stvaranja
stalnih ili prolaznih objekata u naredbama za
definisanje podataka
Moguće je navesti i inicijalizator opšteg
oblika (izraz, izraz, ...), vrijednosti izraza
predstavljaju argumente koji se prenose
odgovarajućem konstruktoru (C++)
Pozivaju se automatski i pri dodjeli memorije
u dinamičkoj zoni pomoću operatora new

Definišu se slično kao i obične funkcije, s
tim što mogu da se navedu i inicijalizatori
za pojedina polja klase, opšti oblik
definicije (C++):
Klasa (parametri) : inicijalizator, ... , inicijalizator, {tijelo}




U slučaju da nema parametara obavezno je
navođenje zagrada ()
U slučaju da je tijelo konstruktora prazno
obavezno je navođenje zagrada {}
Ako ne postoje inicijalizatori, ne koristi se
ni znak “:”
Ne navodi se povratni tip konstruktora





Podrazumijevani (default) konstruktor
Konstruktor kopije
Konstruktor konverzije
Privatni konstruktor
Statički konstruktor






Konstruktor bez parametara ili čiji svi parametri imaju
podrazumijevane vrijednosti
Poziva se automatski kad se stvara objekat bez
inicijalizatora
Obezbjeđuje da će svi primjerci klase biti inicijalizovani,
čak i kada to programer ne traži eksplicitno
Ako u klasi nije definisan nijedan konstruktor,
automatski se generiše podrazumijevani konstruktor sa
praznim tijelom, kao javni
Ako je u klasi definisan bar jedan konstruktor,
podrazumijevani konstruktor se ne generiše automatski
Nema prepreke da se eksplicitno definiše
podrazumijevani konstruktor praznog tijela






Konstruktor koji može da se poziva sa jednim
argumentom tipa svoje klase (koji ima jedan
parametar ili kod koga svi parametri osim prvog
imaju podrazumijevane vrijednosti)
Parametar mora biti upućivač na primjerke klase
Služi za inicijalizaciju primjerka klase kopijom
sadržaja objekta istog tipa
Ako u klasi nije definisan konstruktor kopije, on se
kreira automatski kao javan
Treba da obezbijedi kopiranje cijelog objekta, ne
samo polja klase
Ako postoje pokazivačka polja, automatski
generisan konstruktor kopije nije zadovoljavajući





Konstruktor koji može da se pozove sa jednim
argumentom čiji tip nije jednak posmatranoj klasi
Može da ima i dodatne parametre sa
podrazumijevanim vrijednostima
Služe za konverziju tipova
Može se vršiti konverzija iz standardnih u klasne
tipove, obrnuto ne može
Standardni tipovi nisu klase za koje programer
može definisati konstruktore konverzije




Sprečava kreiranje objekata
Ne omogućava pristup pojedinačnim
članovima (instance)
Omogućava pristup samo statičkim članovima
Jedan od načina za kreiranje funkcija slično
proceduralnom programiranju






Poziva ga class loader u toku rada programa
Može se iskoristiti za inicijalizaciju statičkih
podataka
Izvršava se prije konstruktora klase pri
kreiranju objekata klase (instanciranju)
Ne može se pozivati direktno
Nema modifikator prava pristupa
Nema parametre






Specijalne funkcije članice klasa
Isto ime kao i klasa, sa dodatkom znaka “~”
ispred imena funkcije
Nemaju argumente
Nema preklapanja
Izvršavaju radnje kod uništavanja objekta
Pozivaju se automatski kada objekti gube
doseg


Konstruktori i destruktori
◦ Implicitno se pozivaju - kompajler
Redoslijed poziva
◦ Zavisi od redoslijeda izvršavanja
◦ Kada u toku izvršavanja objekti dobijaju odnosno
gube doseg
◦ Generalno, destruktori se pozivaju u suprotnom
redoslijedu od redoslijeda poziva konstruktora

Kreiranje objekta
◦ Korišćenjem ključne riječi new
◦ Inicijalizacija objekta pomoću konstruktora

Korišćenje objekta
◦ Pozivanje metoda, pristup atributima

Uništavanje objekta
◦ Oslobađanje memorije

Varijable prostih tipova
◦ Životni ciklus je vezan za opseg važenja
◦ Determinističko vrijeme nastajanja i nestajanja

Varijable klasnih tipova
◦ Životni ciklus nije striktno vezan za opseg važenja
◦ Imaju duži životni ciklus
◦ Nedeterministričko vrijeme uništavanja


Nije moguće eksplicitno uništavanje objekata
C# nema naredbu suprotnu naredbi new
◦ Razlog je veliki broj grešaka povezanih sa
uništavanjem objekata u drugim programskim
jezicima

Za uništavanje objekata koristi se Garbage
Collection
◦ Pronalazi nekorišćene objekte i uništava ih
◦ Oslobađa memoriju zauzetu objektima
◦ Oslobađanje memorije vrši se kada je slobodni
memorijski prostor na niskom nivou





Garbage collection poziva destruktor prije
oslobađanja memorijskog prostora zauzetog
objektom
Potrebno je definisati destruktor koji izvršava
odgovarajuće radnje kod uništavanja objekta
Redoslijed i vrijeme izvršavanja destruktora je
neodređeno
Destruktor će sigurno biti pozvan, samo se
ne zna tačno kada
Preporučuje se da se ne koristi destruktor

Automatsko oslobađanje resursa po izlasku iz
bloka using
using (Resource r1 = new Resource( ))
{
r1.Method( );
}





Modifikator static na početku definicije ili
deklaracije člana klase
Član je zajednički za sve objekte te klase
Članovi koji nisu zajednički nazivaju se
pojedinačni
Bez eksplicitnog navođenja svi članovi klase
su pojedinačni
Koriste se u slučajevima kada svi primjerci
klase čine neku logičku cjelinu




Postoji samo jedan primjerak člana, bez
obzira na broj objekata koji se kreiraju
Pristup polju u sastavu bilo kog objekta
predstavlja pristup istoj memorijskoj lokaciji
Promjenom vrijednosti zajedničkih polja utiče
se na stanje svih objekata
Zajednička polja su specijalni globalni podaci





Definisanje primjerka klase podrazumijeva
definisanje svih pojedinačnih polja i dodjelu
memorijskog prostora
Ovo ne važi za zajednička polja, koja se smatraju
posebnim trajnim podacima
Opis zajedničkih polja u klasi smatra se
deklaracijom
Definišu se posebnim naredbama za definisanje
podataka koja se pišu izvan klase (C++)
Mora se koristiti operator za razrješenje dosega
(C++)




Ne posjeduju pokazivač this
Navođenjem samo identifikatora člana mogu
da pristupaju samo zajedničkim članovima
svoje klase
Pojedinačnim članovima mogu da pristupaju
samo za konkretne objekte
Objekti mogu biti parametri zajedničkih
metoda, lokalni objekti u njima ili globalni
objekti

Pristup iz svih vrsta funkcija vrši se
◦ navođenjem konkretnog objekta (objekat.clan ili
pokazivac->clan)
◦ bez navođenja objekta (Klasa::clan)


U metodama iste klase može da se koristi
samo identifikator člana (clan)
Preporučuje se pristup Klasa::clan (Klasa.clan)
jer se time naglašava da se pristupa klasi u
cjelini, a ne samo navedenom objektu







Nisu članice klase
Imaju pravo pristupa do privatnih članova klase
Mogu biti obične funkcije ili metode drugih klasa
U definiciji klase navodi se prototip ili definicija
prijateljske funkcije sa modifikatorom friend
◦ friend tip funkcija(parametri);
◦ friend tip funkcija(parametri) blok
Nevažno je da li se funkcija proglašava
prijateljskom u privatnom ili javnom dijelu
Ako se navede definicija, podrazumijeva se
modifikator inline, kao za članice klase
Identifikator funkcije neće imati klasni doseg, nego
doseg identifikatora cijele klase (obično datotečki
doseg)




Prijateljska funkcija nema pokazivač this na
objekat klase kojoj je prijatelj
Prijateljstvo je relacija koja reguliše pravo
pristupa, a ne oblast važenja i vidljivost
identifikatora
Funkcija može da bude prijatelj većem broju
klasa istovremeno
U nekim situacijama su globalne prijateljske
funkcije pogodnije od funkcija članica
class X {
friend void g (int X&);
friend void Y::h ();
int i;
public:
void f(int ip) {i=ip;}
};
// prijateljska globalna funkcija
// prijateljska clanica h druge klase Y
void g (int k, X &x) {
x.i=k;
// prijateljska funkcija moze da pristupa
}
// privatnim clanovima klase
void main () {
X x;
x.f(5);
g(6,x);
}
// postavljanje preko clanice
// postavljanje preko prijatelja


Sve metode neke klase treba da budu
prijateljske funkcije drugoj klasi
Pogodnije je definisanje prijateljske klase
◦ friend identifikator_klase;
◦ friend class identifikator_klase;

similar documents