Transcript 02-Klase

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( ) balance Deposit( )

BankAccount ?

Withdraw( ) balance Deposit( )

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( ) Deposit( ) balance 12.56

owner "Bert" Withdraw( ) Deposit( ) balance 12.56

owner "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( ) Deposit( ) balance 12.56

interest 7%

Withdraw( ) Deposit( ) balance 99.12

interest 7%

 Zajedničke metode pristupaju zajedničkim podacima, pozivaju se za klasu, ne za objekat The account class An account object

InterestRate( )

interest 7%

Classes contain static data and static methods  

Withdraw( ) Deposit( ) balance 99.12

owner "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 void Time { public: Time(); setTime( int , int , int ); void printUniversal(); void private: int printStandard(); hour; int int }; minute; second;

class Time { public Time() {...} public void {...} setTime( int x, int y, int z) public printUniversal() {...} private int hour; private int private int }; minute; second;

#include 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

class Time { 2 3 public: 4 5 void

Definicija klase počinje ključnom rečju

setTime( int , int class

.

Prototip funkcije koja je

public

.

zagradom.

// set hour, minute, second 6 void 7 void

i klasa,

Time

, i nema

8

povratnu vrijednost.

9 private: 10 11 12 13 int int int private

podaci kojima

hour; minute;

mogu da pristupe samo funkcije članice.

Tijelo klase se završava desnom vitičastom zagradom.

14 }; // end class Time

1 2 // Declaration of class Time. 3 // Member functions are defined in time1.cpp

4 5 Pretprocesorska direktiva kao zaštita od višestukog uključivanja 6 #ifndef TIME1_H 7 #define TIME1_H 8 9 10 class Time { Naming convention: not included if name definiše ime underscore.

.

TIME1_H

11 12 public : 13 14 15 16 17 Time(); // constructor void void void setTime( int , int , int ); printUniversal(); printStandard(); // set hour, minute, second // print universal-time format // print standard-time format 18 private : 19 int hour; // 0 - 23 (24-hour clock format) 20 21 int int minute; second; // 0 - 59 // 0 - 59 22 23 }; // end class Time 24 25 #endif

1 2 // Member-function definitions for class Time.

3 #include 4 5 using std::cout; 6 7 #include 8 9 using std::setfill; 10 using 11 std::setw; Uključivanje header fajla

time1.h

.

12 // include definition of class Time from time1.h

13 #include "time1.h" 14 15 Ime header fajla u duplim 16 navodnicima; uglasti 17 Time::Time() navodnici se koriste za header fajlove iz C++ Standard 18 { 19 hour = minute = second = 0 ; 20 Library.

21 } // end Time constructor 22

23 // Set new Time value using universal time. Perform validity 24 // checks on the data values. Set invalid values to zero.

25 void 26 { Time::setTime( int h, int m, int s ) 27 28 29 hour = ( h >= 0 minute = ( m >= second = ( s >= && h < 0 0 24 && m < && s < 30 31 } // end function setTime ) ? h : 60 60 0 ; ) ? m : 0 ; ) ? s : 0 ; 32 33 // print Time in universal format 34 void Time::printUniversal() 35 { 36 37 38 39 cout << setfill( << setw( 2 << setw( 2 '0' ) << setw( ) << minute << ) << second; 2 ":" ) << hour << 40 } // end function printUniversal 41 ":"

42 // print Time in standard format 43 void Time::printStandard() 44 { 45 46 47 48 cout << ( ( hour == 0 || hour == 12 << ":" << setfill( '0' ) ? ) << setw( 2 12 : hour % ) << minute 12 << ":" << setw( << ( hour < 12 2 ? ) << second " AM" 49 50 } // end function printStandard : " PM" ); )

 ◦ ◦ ◦ ◦ ◦ ◦ 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; }

3 #include 5 using std::cout; 6 using std::endl; 8 #include 10 using 11 using 17 18 19 22 23 24 25 27 }; int int std::setfill; std::setw; void void printUniversal(); printStandard(); hour; minute; Definicija klase

Time

.

13 // Time abstract data type (ADT) definition 14 class Time { 16 public : Time(); void setTime( int , int , int ); // constructor // set hour, minute, second // print universal-time format // print standard-time format private : // 0 - 23 (24-hour clock format) // 0 - 59 int second; // 0 - 59 // end class Time

29 // Time constructor initializes each data member to zero and 30 Constructor inicijalizuje

private

podatak na

0

.

31 Time::Time() 32 { 33 hour = minute = second = 0 ; 34 35 } // end Time constructor 36 37 // set new Time value using universal time, perform validity 38

public

member 39 void 40 Time::setTime( int h, int m, int s ) vrednost parametara 41 42 hour = ( h >= 0 && h < 24 minute = ( m >= 0 ) ? h : 0 pre setovanja

private

podataka.

&& m < 60 ) ? m : 0 ; 43 second = ( s >= 0 && s < 60 ) ? s : 0 ; 44 45 } // end function setTime 46

47 // print Time in universal format 48 void Time::printUniversal() 49 { 50 51 52 53 cout << setfill( '0' << setw( 2 ) << setw( ) << minute << 2 ":" ) << hour << ":" << setw( 2 ) << second; 54 } // end function printUniversal 55 56 // print Time in standard format 57 void 58 { Time::printStandard() 59 60 61 62 63 cout << ( ( hour == 0 << ":" << ":" << setfill( << setw( << ( hour < 12 2 ? || hour == '0' ) << second " AM" ) << setw( : 12 " PM" ) ? ); 2 Nema argumenata.

12 : hour % ) << minute 12 64 } // end function printStandard 65 66 int 67 { 68 main() Deklaracija promenljive

t

kao objekta klase

Time

.

Time t; // instantiate object t of class Time 69 )

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 cout << poziv

public

metode t.printStandard(); // 12:00:00 AM t.setTime( 13 , 27 , 6 ); // change time cout << t.printUniversal(); Postavljanje vrednosti člana klase korišćenjem funckije članice.

public

; cout << t.printStandard(); // 1:27:06 PM Pokušaj postavljanja vrednosti člana klase na t.setTime( 99 , 99 , 99 ); nevalidnu vrednost korišćenjem

public

funkcije članice.

// output t's values after specifying invalid values cout << "\n\nAfter attempting invalid settings:" << "\nUniversal time: " ; t.printUniversal(); // 00:00:00

93 94 95 cout << "\nStandard time: " ; t.printStandard(); // 12:00:00 AM cout << endl; 96 97 98 return 0 ; 99 } // end main

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 nevalidne vrednosti.

0

nakon pokušaja postavljanja

class

{ BankAccount

public

void Withdraw(decimal amount) { ... }

public

void Deposit(decimal amount) { ... }

private private

decimal balance; string name; }

 Deklaracija varijable tipa klase ne kreira novi objekat, potrebno je koristiti operator new class Program { static void Main( ) { Time now; now.hour = 11; BankAccount yours =

new

now yours

hour minute ...

...

BankAccount( ); yours.Deposit(999999M); } } new BankAccount object

 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&); // prijateljska globalna funkcija

friend void

Y::h (); // prijateljska clanica h druge klase Y

int

i;

public

:

void

f(

int

ip) {i=ip;} };

void void

} g ( X x;

int

k, X &x) { x.i=k; // prijateljska funkcija moze da pristupa } // privatnim clanovima klase main () { x.f(5); // postavljanje preko clanice g(6,x); // 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;