23
TEMA:PROGRAMAREA ORIENTATA PE OBIECTE CUPRINS CONSIDERATII STIINTIFICE 1. CONCEPTE DE BAZA IN POO 1.1. ABSTRACTIZAREA DATELOR.INCAPSULAREA 1.2. MOSTENIREA 1.3. POLIMORFISM 2. CLASE (ADT) 2.1. TIPUL STRUCT:DEFINITIE, EXEMPLE TRECEREA LA TIPUL CLASS 2.2. TIPUL CLASS.DEFINITIE .DATE SI METODE MEMBRE .EXEMPLE 2.3. OBIECTE. MEMBRII UNEI CLASE 2.4. VIZIBILITATEA MEMBRILOR CLASEI(MODURI DE ACCES:PRIVATE, PROTECTED,PUBLIC) 2.5. FUNCTII MEMBRE(FUNCTII IN-LINE) 2.6. MEMBRII STATICI 3. CONSTRUCTORI SI DESTRUCTORI 3.1. DEFINITIE.EXEMPLE 3.2. TIPURI DE CONSTRUCTORI(IMPLICITI, DE COPIERE, DEFINITI DE UTILIZATOR).EXEMPLE 4. FUNCTII PRIETENE (FRIEND) .DEFINITIE.EXEMPLE 5. MOSTENIREA 5.1. DEFINITIE.EXEMPLE 5.2. TIPURI DE MOSTENIRE 5.3. CLASE DERIVATE 5.4. COMPORTAMENTUL CONSTRUCTORILOR SI DESTRUCTORILOR IN CAZUL CLASELOR DERIVATE 6. POLIMORFISMUL 6.1. CLASE VIRTUALE.EXEMPLE. 6.2. FUNCTII VIRTUALE.EXEMPLE 7. SUPRAINCARCAREA OPERATORILOR 7.1. SINTAXA PENTRU SUPRAINCARCARE 7.2. EXEMPLE .OPERATORII ARITMETICI, OPERATORII (),[],<<,>> 7.3. SUPRAINCARCAREA FUNCTIILOR.DEFINITIE.EXEMPLE. Consideratii metodice Realizarea unui soft educational care sa cuprinda :lectii, teste on-line si aplicatii .

LUCRARE GRADUL 12

Embed Size (px)

DESCRIPTION

info

Citation preview

Page 1: LUCRARE GRADUL 12

TEMA:PROGRAMAREA ORIENTATA PE OBIECTECUPRINSCONSIDERATII STIINTIFICE

1. CONCEPTE DE BAZA IN POO1.1. ABSTRACTIZAREA DATELOR.INCAPSULAREA1.2. MOSTENIREA1.3. POLIMORFISM

2. CLASE (ADT)2.1. TIPUL STRUCT:DEFINITIE, EXEMPLE TRECEREA LA TIPUL CLASS2.2. TIPUL CLASS.DEFINITIE .DATE SI METODE MEMBRE .EXEMPLE2.3. OBIECTE. MEMBRII UNEI CLASE2.4. VIZIBILITATEA MEMBRILOR CLASEI(MODURI DE ACCES:PRIVATE,

PROTECTED,PUBLIC)2.5. FUNCTII MEMBRE(FUNCTII IN-LINE)2.6. MEMBRII STATICI

3. CONSTRUCTORI SI DESTRUCTORI3.1. DEFINITIE.EXEMPLE3.2. TIPURI DE CONSTRUCTORI(IMPLICITI, DE COPIERE, DEFINITI DE

UTILIZATOR).EXEMPLE

4. FUNCTII PRIETENE (FRIEND) .DEFINITIE.EXEMPLE

5. MOSTENIREA 5.1. DEFINITIE.EXEMPLE 5.2. TIPURI DE MOSTENIRE 5.3. CLASE DERIVATE 5.4. COMPORTAMENTUL CONSTRUCTORILOR SI DESTRUCTORILOR IN CAZUL CLASELOR DERIVATE

6. POLIMORFISMUL 6.1. CLASE VIRTUALE.EXEMPLE.6.2. FUNCTII VIRTUALE.EXEMPLE

7. SUPRAINCARCAREA OPERATORILOR7.1. SINTAXA PENTRU SUPRAINCARCARE7.2. EXEMPLE .OPERATORII ARITMETICI, OPERATORII (),[],<<,>>7.3. SUPRAINCARCAREA FUNCTIILOR.DEFINITIE.EXEMPLE.

Consideratii metodiceRealizarea unui soft educational care sa cuprinda :lectii, teste on-line si aplicatii .

Page 2: LUCRARE GRADUL 12

PROGRAMAREA ORIENTATĂ PE OBIECTE

INTRODUCERE

Programele aplicative prelucrează informaţii din realitatea inconjurătoare: inventariază carţile dintr-o bibliotecă, prelucrează texte, gestioneză activitatea unor firme, poiectează instalaţii etc.

Limbajele de programare trebuie să fie capabile să reprezinte obiectele din realitate cat mai fidel.Apare necesitatea unui tip de date care să definească o “cutie neagră” care să nu mai poată fi modificată ci doar adaptată la noile cerinţe ale programului.

Tipurile de date puse la dispoziţie de programarea structurată (inregistrarea si tabloul) sunt insuficiente pentru modelarea realităţii.Ele surprind doar starea obiectelor la un moment dat, fără a evidenţia funcţionalitatea lor.

Ideea de bază de la care pleacă programarea orientată obiect este de a grupa structurile de date cu operaţiile care prelucrează respectivele date. Programarea orientată pe obiecte nu este ceva nou;conceptele sale specifice (abstractizarea datelor, moştenirea si polimorfismul) au apărut iniţial în alte limbaje cum ar fi:Simula67, Smalltalk.

C++ a fost dezvoltat la inceputul anilor 1980 de Bjarne Stroustrup de la AT&T Bell Laboratories.El a creat C++ prin adăugarea de noi facilitaţi limbajului C pentru ca acesta să suporte in mod eficient programele de simulare bazate pe evenimente.

Programarea orientată pe obiecte a devenit foarte populară, mai ales datorită avantajelor sale care ajută dezvoltării proiectelor actuale, ce devin din ce in ce mai complexe. Acest stil de programare duce la impărţirea aplicaţiilor in mai multe module, astfel încât cel ce dezvoltă un modul nu trebuie să cunoască detaliile de implementare ale altor module.

O aplicaţie a POO este programarea vizuală.Astăzi este de neconceput realizarea unei aplicaţii fără o interfaţă grafică tip Windows (Visual C++, C++ Builder etc.).

Page 3: LUCRARE GRADUL 12

CAPITOLUL 1: CONCEPTE DE BAZĂ ÎN POO

Programarea orientată pe obiecte este o tehnică de programare care dispune de instrumente puternice pentru abstractizarea şi modularizarea datelor.

Un limbaj de programare orientat pe obiecte are mecanismele necesare susţinerii acestui stil de programare.

1.1. ABSTRACTIZAREA DATELOR.ÎNCAPSULAREA

Simularea obiectelor din lumea reală este posibilă prin definirea unui tip de dată abstract.Termenul de tip abstract de dată se referă la un tip de date definit de utilizator impreună cu un set de operaţii ce se pot efectua asupra acestor date.

Definirea unui tip abstract de date implică specificarea reprezentării interne a datelor din acel tip, precum şi a funcţiilor pe care alte module de program le vor utiliza pentru manipularea tipului abstract de date.

In acest mod se realizează o ascundere a informaţiei şi implicit o protecţie a datelor.Ascunderea informaţiilor înseamnă defapt ascunderea detaliilor de implementare şi reprezintă defapt conceptul POO de încapsulare.

Încapsularea informaţiei permite utilizatorului să trateze clasele şi obiectele acestora ca pe nişte cutii negre .Utilizatorul nu trebuie să cunoască detalii interne de realizare a unei funcţii membre ci doar operaţia realizată de aceasta;mai simplu:nu ne interesează schema internă a maşinii de spălat, a televizorului sau a calculatorului ci doar cum funcţionează ele.

Încapsularea este mecanismul prin care datele (variabilele) şi funcţiile (numite si metode) sunt plasate impreună, într-o unică structură.

În POO se pot crea obiecte aparţinând unui tip abstract de date .Un obiect este o entitate care combină atât date cât şi funcţii care

manevrează aceste date.Se mai poate spune că obiectele sunt variabile apartinând unui tip de date definit de utilizator.

De exemplu, programatorul îşi poate defini tipul (clasa) matrice şi operatorii care pot fi aplicaţi matricilor (* pentru înmulţirea a două matrici, + pentru adunarea a două matrici, - pentru scăderea a două matrici, etc). Astfel, el poate folosi tipul matrice în mod similar unui tip predefinit:

matrice A, B;matrice C=A+B;Tipul unui obiect (şablon al obiectului) este o clasă. O clasă se

caracterizează prin: numele clasei, atribute, funcţii şi relaţii cu alte clase.Instanţa este un obiect dintr-o clasă (A, B, C sunt obiecte, instanţe ale

clasei matrice) şi are proprietăţile definite de clasă. Pentru o clasă definită, se pot crea mai multe instanţe ale acesteia. Toate obiectele au o stare şi un comportament. Starea unui obiect se referă la elementele de date conţinute în obiect şi la valorile asociate acestora (datele membre).

Comportamentul unui obiect este determinat de care acţiunile pe care obiectul poate să le execute (metodele).

Atributele specificate în definiţia unei clase descriu valoric proprietăţile obiectelor din clasă, sub diferite aspecte.

Page 4: LUCRARE GRADUL 12

În limbajul C++ atributele se numesc date membre. Toate datele membre sunt atribute instanţă. Atributele de clasă se pot obţine în cazul datelor membre statice (aceeaşi adresă de memorare pentru orice instanţă a clasei).

Metode (funcţii membre). La definirea unei clase se definesc şi metodele acesteia (numite şi funcţii membre). Fiecare obiect are acces la un set de funcţii care descriu operaţiile care pot fi executate asupra lui. Metodele pot fi folosite de instanţele clasei respective, dar şi de instanţele altor clase (prin mecanismul moştenirii).Clasa conţine atât structurile de date necesare descrierii unui obiect, cât şi metodele care pot fi aplicate obiectului. Astfel, gradul de abstractizare este, mult mai ridicat, iar programele devin mult mai uşor de înţeles, depanat sau întreţinut.

La crearea unui obiect, alocarea memoriei se poate fi face static sau dinamic (cu ajutorul unor funcţii membre speciale, numite constructori). Eliberarea memoriei se realizează cu ajutorul unor funcţii membre speciale, numite destructori, în momentul încheierii existenţei obiectului respectiv.

Concluzie 

Un tip abstract de date poate fi considerat ca un model , un şablon, după care se pot crea exemplare de obiecte specifice atunci când este nevoie.

1.2. MOŞTENIREA

Moştenirea este o caracteristică a limbajelor de programare orientate obiect, care permite refolosirea codului şi extinderea funcţionalităţii claselor

Page 5: LUCRARE GRADUL 12

existente.Mecanismul moştenirii permite crearea unei ierarhii de clase şi trecerea de la clasele generale la cele particulare.

In vârful ierarhiei se află clasa care are ” trasături comune ” pentru toate celelalte componente ale ierarhiei respective.Pe nivelul următor al ierarhiei se află clasele care pe lângă trăsăturile comune mai au şi trăsături specifice.

Ca exemplu putem lua clasificarea poligoanelor.Poligonul este in vârful ierarhiei, pe nivelul următor triunghiul şi patrulaterul.Plecând de la patrulater se obtine paralelogramul şi apoi dreptunghiul, care este un paralelogram la care se adaugă condiţia să aibă un unghi drept.Iată ierarhia arborescentă în figura de mai jos :

Pătratul (un dreptunghi cu toate laturile egale) moşteneşte toate proprietăţile dreptunghiului la care se adaugă şi alte proprietăţi (diagonalele lui sunt axe de simetrie).Clasa POLIGON reprezintă clasa de bază (este o generalizare) şi conţine informaţiile comune (disponibile prin moştenire şi subclaselor acesteia).Clasele DREPTUNGHI şi ROMB reprezintă clase derivate (sunt o particularizare, o specializare a clasei PARALELOGRAM) care extind funcţionalitatea clasei de bază şi conţin informaţiile specifice. Se mai poate spune ca DREPTUNGHI si ROMB sunt clase, iar PARALELOGRAM este superclasă. Moştenirea poate fi: unică sau multiplă.

MOŞTENIREA UNICĂ

În cazul moştenirii unice, fiecare clasă are doar o superclasă. Există două modalităţi de specializare a unei clase de bază:

introducerea de extra-atribute şi extra-metode în clasa derivată (particulare doar clasei derivate);redefinirea membrilor în clase derivate (polimorfism).

PARALELOGRAM

DREPTUNGHI ROMB

PĂTRAT

POLIGON

TRIUNGHIPATRULATER

Page 6: LUCRARE GRADUL 12

MOŞTENIREA MULTIPLĂ În situaţia moştenirii multiple, o clasă are mai multe superclase.

1.3. POLIMORFISMUL

Polimorfismul este un concept strâns legat de conceptul de moştenire.Polimorfism inseamnă că o anumită operaţie poate să funcţioneze diferit pentru obiecte diferite.De exemplu, operaţia de adunare se efectuează intr-un fel pentru două numere intregi si in alt fel pentru două matrici.Revenind la exemplul cu figurile geometrice, se observă că fiecarei figuri (poligon, triunghi,paralelogram etc.) i se poate calcula perimetrul,aria si fiecare figură ar putea fi desenată pe ecran.

A

Moştenirea simplă (unică)

B C D

E F G H

A

B C D

E F

Moştenirea multiplă

Page 7: LUCRARE GRADUL 12

Funcţiile care realizează desenarea sunt de fapt versiuni ale aceleiaşi funcţii (polimorfism vine din limba gracă şi înseamnă ” a avea mai multe forme ”).

De exemplu, dacă avem urmatoarele instanţieri :poligon p(…) ;dreptunghi d(…) ;patrat pt(…) ;

atunci apelul :

p.desenează() ;//desenează poligonul definit de obiectul p.Anolog,

d.desenează() ;//desenează un dreptunghipt.desenează() ;//desenează un patrat etc.

In cadrul apelurilor de mai sus se utilizează, de fiecare dată, funcţia membru desenează a clasei corespunzătoare obiectului prezent în apel. Polimorfismul permite simplificarea utilizării obiectelor din clase diferite .Selectarea unei metode redefinite poate fi realizată în faza de compilare (legarea iniţială), sau în momentul execuţiei (legarea târzie). În limbajul C++, legarea dinamică se poate realiza prin implementarea de:

funcţii virtuale (pot fi redefinite polimorfic);funcţii virtuale pure (doar declarate, nu definite).

Aceste aspecte se vor detalia in capitolul 6.

CAPITOLUL 2: CLASE (AbstractDataType)

2.1. TIPUL STRUCT:DEFINIŢIE, EXEMPLE. TRECEREA LA TIPUL CLASS

Page 8: LUCRARE GRADUL 12

Prezenţa datelor şi a prelucrărilor împreună si-a făcut apariţia incă din epoca limbajului C.Astfel, au apărut structurile şi uniunile.

Definiţie Tipul struct (inregistrare) este un tip de dată care permite înglobarea mai multor tipuri eterogene.Să presupunem că trebuie să prelucram simultan informaţii despre un produs:

Denumire – char denumire[20];Preţ – int pret;Cantitate – int cantitate;

Se poate utiliza un vector? (nu deoarece acesta poate reţine date de acelaşi tip) Informaţiile pe care trebuie să le implementăm sunt eterogene (de tipuri diferite ).In C++ există tipul de date struct cu urmatoarea sintaxă generală:

Pentru exemplul de mai sus structura poate fi :

1. structura se numeşte produs şi are campurile :denumire,preţ,cantitate;2. structura are campurile :denumire,preţ,cantitate. Produs este o variabilă de

tipul struct ;3. structura se numeşte produs şi are câmpurile :denumire,preţ,cantitate. P,P1

sunt variabile de tipul produs;

Accesarea câmpurilor structurii

Pentru accesarea câmpurilor unei structuri se foloseşte operatorul de selecţie

directă ” . ”.p.denumire – câmpul denumire al variabilei p;p.pret – câmpul preţ al variabilei p;p.cantitate – câmpul cantitate al variabilei p;

struct [nume structura]{tip camp1; tip camp2;…………tip camp n;}[lista variabile];

Nu pot lipsi simultan!!

1struct produs{char denumire[20]; int pret; int cantitate;};

2struct {char denumire[20]; int pret; int cantitate;}produs;

3struct produs{char denumire[20]; int pret; int cantitate;}p,p1;

Page 9: LUCRARE GRADUL 12

Iată in continuare un exemplu de ” structură orientată pe obiecte ” :

Exemplul 1- structură în care se poate încorpora un pointer la o funcţie (in limbajul C)

Exemplul 2 – structură orientată pe obiecte (in limbajul C++)

#include<conio.h>#include<iostream.h>struct exemplu1 //definire tip abstract de date utilizând struct{ int info; int (*functie)();//membru pointer la funcţie};

int functie1();//prototipul funcţiei, compatibilă cu pointerul //specificat ca membru în struct

exemplu1 ex;//instanţa ex

void main(){ ex.info=11;//iniţializarea membrului info clrscr(); ex.functie=&functie1;// iniţializarea membrului pointer la funcţie cout<<ex.functie();//utilizarea membrului pointer la funcţie getch();}

int functie1(){return ex.info*ex.info;}

#include<conio.h>#include<iostream.h>struct exemplu2 //definire tip abstract de date utilizând struct{ int info; int functie ();//membru funcţie};

int exemplu2::functie(){return info* info;}

exemplu2 ex;//instanţa ex

void main(){ ex.info=11;//iniţializarea membrului info clrscr(); cout<<ex.functie();//utilizarea membrului funcţie getch();}

Page 10: LUCRARE GRADUL 12

Exemplul 3 – structură orientată pe obiecte alocată dinamic (in limbajul C++)

Concluzie : Intr-un tip de dată structurată ca inregistrare se pot introduce şi funcţii (eventual gestionate prin pointeri) care să indice prelucrările la care pot fi supuse datele.Astfel se obţine asa numitul tip incapsulat (user built-in), care în C++ este definit prin noţiunea de clasă.

#include<conio.h>#include<iostream.h>struct exemplu3 //definire tip abstract de date utilizând struct{ int info; int functie ();//membru funcţie};

int exemplu3::functie(){return info* info;}exemplu3 *pex;//declararea unui pointer la structură exemplu3

void main(){ pex=new exemplu3;// pex->info=11;//iniţializarea membrului info clrscr(); cout<<pex->functie();//utilizarea membrului funcţie getch(); delete pex;//eliberarea memoriei gestionată de pex}

Page 11: LUCRARE GRADUL 12

2.2. TIPUL CLASS.DEFINIŢIE .DATE ŞI METODE MEMBRE .EXEMPLE

Tipul class are, pe lângă sintaxa de bază, şi o serie de elemente specifice programării orientate pe obiecte (clasele şi funcţiile prietene, supradefinirea operatorilor, moştenirea etc.)

Definitie Tipul class (clasa) este un tip abstract de structură, care defineşte o mulţime de valori şi operaţiile care actionează asupra acelori valori.

Operaţiile sunt definite fară referiri la reprezentarea sau implementarea valorilor.Valorile se numesc date membru, iar operaţiile se numesc funcţii membru (sau metode).Declararea unei clase cuprinde definirea : antetului şi a corpului ei.

Antetul reprezintă interfata şi conţine toate informaţiile legate de clasa respectivă :datele şi prototipurile/definirile funcţiilor – şi informaţiile pentru alocarea de memorie de către compilator.Corpul conţine definirea funcţiilor declarate în antet.

Page 12: LUCRARE GRADUL 12

Sintaxa pentru declararea unei clase este următoarea :

Antetul clasei

class nume_clasa{ private: date membru private constructori privati functii membre private protected : date membru protejate constructori protejati functii membre protejate public : date membru publice constructori publici destructor public functii membre publice} ;

Corpul clasei

tip_functie_membru1 nume_clasa::nume_functie_membru1(lista parametrilor) {…}tip_functie_membru2 nume_clasa::nume_functie_membru2(lista parametrilor) {…}…

ObservaţiiPrivate, protected şi public sunt cuvinte cheie care specifică modul de acces la datele şi metodele din secţiunea delimitată de fiecare ;În cazul tipurilor de date definite cu ajutorul structurilor, se pot aplica modificatorii de acces. În cazul tipurilor definite cu ajutorul uniunilor, accesul implicit (public) nu poate fi modificatUn membru al clasei (dată sau metodă) este calificat în corpul clasei prin operatorul de rezoluţie ” :: ” ;Variabilele de tipul definit prin class se numesc instanţe ale clasei ;un membru al clasei este calificat folosind operatorii ” . ” (operator de selecţie directă) sau ” -> ” ( operator de selecţie indirectă).

O variabilă de tip clasă poate stoca un set complet al datelor clasei respective.Acest set reprezintă o instanţiere a clasei, adică o manifestare concretă a clasei.In teoria programării orientate pe obiecte, o astfel de instanţă poartă numele de obiect.

Exemple de construire a unor clase 

1. Definirea tipului complex cu ajutorul unei clase

#include<iostream.h>

Page 13: LUCRARE GRADUL 12

class complex //antetul clasei { protected: double re;//datele membre double im; public://metodele membre void initializare (double inire,double iniim) {re=inire;im=iniim;} double returnre()//returneaza partea reala {return re;} double returnim()//returneaza partea imaginara {return im;} void adunare_complex(complex c1,complex c2) ; void afisare_complex() ;//afisarea unui numar complex } ;//corpulclasei void complex :: adunare_complex(complex c1,complex c2)  { re=c1.re+c2.re ; im=c1.im+c2.im ; } void complex :: afisare_complex() {if (re>=0) cout<<re<< ″+i″ ; else cout <<″(″<<re<<″)+i″ ; if (im>=0) cout<<im; else cout <<″(″<<im<<″) ″ ; cout<<endl; }//functia mainvoid main(){complex c1,c2,c3;double r,i;cout<<″Introduceti valorile pentru primul numar: ″ ;cin>>r>>i ;c1.initializare(r,i) ;cout<<″Introduceti valorile pentru al doilea numar: ″ ;cin>>r>>i ;c2.initializare(r,i) ;c1.afisare_complex();c2.afisare_complex();c3.adunare_complex(c1,c2) ;cout<<endl ;cout<<″rezultatul adunarii ″<<endl;c3.afisare_complex();cout<<endl;//acelasi rezultat se obtine astfelcout<<c3.returnre()<<″″<<c3.returnim();}

2. Definirea tipului dreptunghi cu ajutorul unei clase

#include <iostream.h>class dreptunghi{ //antetul clasei

double lungimea, latimea;//datele membrepublic://functiile(metodele) membre

void dimensiuni(double, double );double arata_lungimea()

{return lungimea;}double arata_latimea()

{return latimea;}

Page 14: LUCRARE GRADUL 12

double arie(){return lungimea*latimea;}

};//corpul claseivoid dreptunghi:: dimensiuni(double L, double l)

{lungimea=L; latimea=l;}void main(){ dreptunghi a;double l1, l2;

cout<<"Lungime="; cin>>l1;cout<<"Latime="; cin>>l2;a. dimensiuni(l1, l2);cout<<"Dimensiunile dreptunghiului sunt:";cout<<a.arata_lungimea()<<" si"<<a.arata_latimea()<<endl;cout<<"Aria dreptunghiului:"<<a. arie()<<endl;cout<<"Dimens :"<<sizeof(a)<<endl;

}ObservaţieNivelul de acees implicit la membrii clasei este private. Dacă pentru metode nu s-ar fi folosit modificatorul de acces public, metodele nu ar fi putut fi folosite în funcţia main.

2.3. OBIECTE. MEMBRII UNEI CLASE

Un obiect este o dată de tip definit printr-o clasă.Declararea obiectelor de un anumit tip are o formă asemănătoare celei pentru datele de tip predefinit:

nume_clasa lista_obiecte;

În exemplul 2 în funcţia main, se declară obiectul (variabila) a de tip dreptunghi. Obiectul a este o instanţă a clasei dreptunghi. Se pot declara oricâte obiecte (instanţe) ale clasei. Exemple:

dreptunghi a;dreptunghi b, c, d;

Datele membru se alocă distinct pentru fiecare instanţă (atribute ale instanţei) a clasei (pentru declararea obiectelor a, b, c, d de tip dreprunghi, vezi figura de mai jos). Excepţia de la această regulă o constituie datele membru statice (2.5.), care există într-un singur exemplar, comun, pentru toate instanţele clasei.

a.latimea

a.lungimealungimea

latimea

ab

lungimea

latimea

b.lungimea

b.latimea

Page 15: LUCRARE GRADUL 12

Metodele figurează într-un singur exemplar, oricâte instanţe ale clasei ar exista.

În exemplul anterior, metoda dimensiuni este doar declarată în interiorul clasei, fiind abia apoi definită. La definirea funcţiei (void dreptunghi:: dimensiuni(double lungimeaL, double l)) s-a folosit operatorul :: (scope resolution operator) care specifică relaţia de apartenenţă a metodei la tipul dreptunghi.

Operatorul cuplează nume_clasa::nume_functie_membru şi defineşte domeniul (scopul) în care acea funcţie va fi recunoscută. Prezenţa numelui clasei în faţa funcţiei membru este obligatorie, deoarece, altfel nu s-ar putea face distincţia între metode cu nume identice, care aparţin unor clase diferite.

O funcţie membru se apelează totdeauna în strânsă dependenţă cu un obiect din clasa respectivă. Legătura dintre obiect şi funcţia membră se face prin operatorul . sau operatorul ->, după cum obiectul este desemnat prin nume sau prin pointer.

Exemplu

class dreptunghi{double lungimea, latimea;

public:void dimensiuni(double, double );double arata_lungimea();double arata_latimea();double arie();

};//……………………………………………………………………………..void main()

{ dreptunghi a;//a obiect din clasa dreptunghi//……………………………………………………………………cout<<"Aria dreptunghiului:"<< arie()<<endl;dreptunghi *pa;//obiect desemnat prin pointerpa=&a;double aria=pa-> arie();cout<<"Aria dreptunghiului:"<< arie()<<endl;

}

Page 16: LUCRARE GRADUL 12

2.4. VIZIBILITATEA MEMBRILOR CLASEI(MODURI DE ACCES:PRIVATE, PROTECTED,PUBLIC)

În cadrul declarării unei clase există trei grade de blocare a accesului la elementele componente, date şi funcţii:

private – domeniul privat, care conţine membrii proprii sau privaţi ai clasei ;acest tip de membru este accesibil numai funcţiilor membre ale clasei.Instanţelor clasei li se interzice accesul la membrii privaţi ;protected – domeniul protejat, care conţine membrii protejaţi ;ei sunt accesibili numai funcţiilor membru ale clasei respective si funcţiilor membru ale claselor derivate din aceasta.Instanţele clasei nu pot accesa membrii protejaţi ;public – domeniul public, care conţine membrii publici ; acest tip de membri sunt vizibili pentru funcţiile membru ale clasei, pentru instanţele clasei, pentru funcţiile membru ale claselor derivate şi pentru instanţele acestora.

Observatii

Ordinea în care sunt utilizate aceste trei moduri de acces nu este impusă, dar membrii unei clase, neincluşi in niciunul dintre aceste niveluri, sunt consideraţi implicit private. Încapsularea datelor membru şi a funcţiilor membru în cadrul obiectului oferă funcţiilor membru dreptul de a accesa datele membru.

Page 17: LUCRARE GRADUL 12

2.5. FUNCŢII MEMBRE(FUNCŢII IN-LINE)

DEFINIŢIE O funcţie este considerată ca fiind membru al unei clase dacă prototipul ei este încadrat în declararea antetului clasei respective (corpul funcţiei putând fi definit în afara antetului clasei cu ajutorul operatorului de rezoluţie “::”).

TIPURI DE FUNCŢII MEMBRU

Funcţii pentru administrarea clasei – reprezintă setul de funcţii care realizează : crearea obiectelor (constructori), distrugerea obiectelor (destructori), operaţia de atribuire între obiecte (operator =) etc.;Funcţii pentru implementarea clasei – implementează comportamentul tipului de date reprezentat de clasa respectivă (pentru clasa Complex: adunarea, scăderea etc. a două numere complexe, modulul unui număr complex etc. ); Funcţii de acces la clasă – acestea returnează valorile unor date membre declarate private.

OBSERVAŢIE

Dacă funcţia este definită in interiorul clasei atunci ea trebuie să fie o funcţie inline. O funcţie inline este o funcţie care nu conţine structuri repetitive şi nici structuri switch.De exemplu funcţia arată_lungimea() din clasa dreptunghi prezentată în paragraful 2.2. la exemplul 2:

double arata_lungimea() {return lungimea;}

ASPECTE PRIVIND DEFINIREA FUNCŢIILOR MEMBRU

Modul de utilizare al funcţiilor inline

Page 18: LUCRARE GRADUL 12

Funcţiile definite in antetul clasei sunt automat de tip inline (apelul funcţiei este înlocuit peste tot în program cu codul întregii funcţii ceea ce duce la scăderea timpului de execuţie – se evită transmiterea parametrilor de apel pe stiva sistemului);Funcţiile definite în exteriorul antetului clasei conţin cuvântul cheie inline şi la declararea funcţiei cât şi la definirea ei;

Sintaxa declarării unei funcţii inline este următoarea:

inline tip_returnat nume_funcţie ([listă parametri]);

Pointerul this

Fiecare funcţie membru posedă un argument ascuns, numit this ;acesta este transmis automat de către compilator.This este un pointer către obiectul care apelează funcţia.Spre deosebire de pointerii obişnuiţi, pointerul this realizează uniunea dintre membrii clasei şi funcţia ce acţionează asupra lor (funcţie membru).Exemple :

1. Să presupunem că am dori să cunoştem adresa fizică a unui obiect din clasa dreptunghi.Ataşăm clasei următoarea funcţie membru : void dreptunghi :: afişează_adresa() { cout<<”Adresa fizica a acestui obiect este “<<this;}

2. Utilizarea explicită a pointerului this poate fi observată în funcţia de mai jos :

void dreptunghi :: afiseaza_latimea(){cout<<”Lătimea este ”<< this->latimea;}

Atributul const

Atributul const este utilizat pentru a face distincţie între funcţiile care modifică valorile datelor membre şi cele care nu le modifică:cele din urmă au atributul const in declaraţie, plasat astfel:

Tip_returnat clasa::nume_funcţie() const {…}

Odată declarat acest atribut, orice tentativă de a modifica datele unui obiect este semnalată ca eroare.

Page 19: LUCRARE GRADUL 12