Sunteți pe pagina 1din 188

LIMBAJUL C++

Programarea orientat pe obiecte

Introducere

Exist limbaje concepute strict pe baza POO, ex. Simula, Smalltalk, Java; O alt abordare - adaugarea tehnicilor POO limbajelor cu mare polularitate, ex. Pascal i C; C++ combin avantajele oferite de C (eficien, flexibilitate, portabilitate) cu avantajele oferite de POO.
2

Programarea orientat pe obiecte n C++

Scopul limbajului C++ este s permit dezvoltarea programelor complexe (peste 25.000 linii cod surs); C++ asigur programatorului libertatea i controlul din C, mpreun cu puterea obiectelor; POO combin metodele programrii structurate cu concepte noi;
3

C++ conine mbuntiri ale limbajului C care nu sunt direct legate de POO, cum ar fi:

Tipul referin; Funcii inline; Suprancrcarea operatorilor; Operatori pentru gestionarea memoriei libere.
4

Ce este programarea orientat pe obiecte ?

n POO se mparte o problem n subgrupe de seciuni nrudite, care in seam att de cod ct i de datele corespunztoare din fiecare grup. Se organizeaz apoi, aceste subgrupe pe structuri ierarhice; Se transform subgrupele n uniti de sine stttoare, numite obiecte.
5

Toate limbajele OO au 3 caracteristici comune: ncapsulare, polimorfism i motenire

ncapsularea este un mecanism care leag mpreun cod i date; Permite crearea unui obiect; Un obiect este o entitate logic care ncapsuleaz att date ct i cod care manevrez aceste date; Cnd se definete un obiect, implicit se creeaz un nou tip de date !
6

Polimorfism

n POO polimorfismul se aplic metodelor unei clase i permite definirea unor funcii cu acelai nume dar cu comportament diferit (specific); Exemplu: metoda de calculat aria unui poligon;

Motenirea

Este procesul prin care un obiect poate s preia prototipul altui obiect; Se admite astfel conceptul de clasificare; Exemplu:

Clasa mamifer

Clasa pisica

Clasa pisic birmanez


8

Inregistrare - Clas

n numeroase aplicaii, este necesar s se prelucreze date grupate sub forma de nregistrri, situate fizic fie n fiiere, fie n memoria intern. S considerm, de exemplu, evidena materialelor dintr-o magazie. Fiecare material se caracterizeaz prin mai multe atribute, cum sunt: codul materialului, denumirea materialului, cantitatea.
9

Informaia despre un material ar putea fi, deci, pstrat pe un formular de hrtie avnd, ca exemplu, urmtorul coninut: MATERIAL Cod material: 13027522 Denumire material: Pnza alb bumbac Cantitate: 127.53

10

Pentru prelucrare, aceste date sunt grupate ntr-o nregistrare de forma: 127.53

13027522 Pnza alb bumbac

11

Remarcm c aceast structur, care se introduce n memoria calcula-torului, conine numai datele, nu i alte informaii, cum ar fi denumirile atributelor i tipurile de date din fiecare cmp. Descrierea acestei structuri se face n program, folosind o instruciune numit declaraie de structur. Forma declaraiei depinde de sintaxa limbajului de programare utilizat.
12

In limbajul C, aceleai declaraii se fac sub forma:


typedef struct{ int cod; char nume[30]; double cantitate} Material; Material a, b, c;

13

Remarcm c nici n Pascal, nici n C nu este predefinit un tip de date numit Material, dar limbajul pune la dispoziia programatorului modalitatea prin care el poate s defineasc un astfel de tip.

14

nregistrarea (engl: record) este o structur de date neomogen cu urmtoarele caracteristici:

Componentele nregistrrii, numite n mod uzual cmpuri (engl. fields), au fiecare propriul su nume; Cmpurile nregistrrii pot aparine unor tipuri de date diferite (de aceea spunem c este o structur neomogen); n memorie cmpurile sunt aezate consecutiv (n linie), ocupnd o zon de memorie compact.
15

Primele dou caracteristici se refer la conceptul abstract de nregistrare, iar ultima caracteristic se refer la modul de implementare. Cmpurile de date dintr-o nregistare pot conine nu numai date primitive, ci i structuri de date. n particular, orice cmp al unei nregistrri poate fi el nsui o nregistrare.
16

Clasa ca extindere a structurii de nregistrare

n limbajele de programare OO, structura de nregistrare a fost extins, astfel nct n afar de date sa conin i metode, adic funcii sau proceduri prin care se prelucreaz datele respective. S-a obinut astfel conceptul de clas. Clasa nu mai este o simpl structur de date, ci un modul de program, care conine att date, ct i metode. Se poate deci considera c nregistrarea este un caz particular de clas, care nu conine metode.

17

Clasele structuri abstracte de date, definite de utilizator, care ncapsuleaz att datele propriu-zise ct i operaiile efectuate asupra acestora.

Un obiect este o instan a unei clase. Clasa = abstractizare logic; Obiect = real, exist n memoria calculatorului; O clas are atribute (caracteristici-date) i metode (funcii);

18

mbuntiri ale limbajului C introduse n C++


1.

Transmiterea parametrilor n C++ exist 2 posibiliti de transmitere a param. actuali ctre o funcie:

Prin valoare; Prin referin.

Primul este modul standard de transmitere a param. n C.


19

Transmiterea parametrilor prin referin

Prin folosirea param formali referin se permite realizarea transferului prin adres, la fel ca n Pascal (paramerii VAR). Se elimin astfel necesitatea utilizarii param formali pointeri, n cazul n care modificrile fcute n interiorul funciei asupra param. trebuie s rmn i dup revenirea din procedur.

20

Exemplu
void schimb(int &a, int &b){ int aux=a; a=b; b=aux;} Transferul prin referin este util atunci cnd programul are dimensiune mare (struct, class) i crearea n stiv a unei copii a valorii lui reduce viteza de execuie i ncarc memoria.
21

2. Parametri cu valori implicite

n C++ se pot declara funcii cu valori implicite ale parametrilor; La apelarea acestor funcii se poate omite specificarea param efectivi pentru aceia care au fost declarai cu valori implicite; Este obligatoriu ca numai ultimii param s aib valori implicite i nu este permis alternarea param cu i far valori implicite.
22

Exemplu- Val_impl.cpp
void fct(int, int=10); void fct(int p1, int p2){ cout<<p1; cout<<p2; } void main() { fct(1,2); fct(3); }
23

3. Funcii inline

Prezena funciilor inline anun compilatorul s nu mai genereze cod main necesar apelului i revenirii, ceea ce conduce la micorarea duratei de execuie. Practic, funciile care au corpul format din maximum 3 instruciuni i nu conin instruciuni repetitive (for, while, do-while) pot fi declarate funcii inline.
24

Declararea funciei inline


inline <tip_vret><nume>(lista param. formali); n cazul metodelor unei clase, dac acestea sunt definite n interiorul clasei, ele sunt considerate implicit funcii inline; Exist i posibilitatea de a declara metoda la definirea clasei i de a specifica, explicit, c este funcie inline la definirea funciei.
25

Exemplu
class Dreptunghi { //. public: //. void seteaza_dim (double, double); //declarare metoda }; inline void Dreptunghi::seteaza_dim (double L, double l) {lung=L;lat=l;}
26

4. Supradefinirea (suprancrcarea) funciilor

C++ permite suprancrcarea (overloading) funciilor, adic existena mai multor funcii cu acelai nume; Compilatorul va determina care funcie va fi apelat prin examinarea numrului i tipului de argumente; Nu se verific i tipul valorii returnate, deci 2 fct. suprancrcate NU pot diferi doar prin valoarea returnat.
27

Exemplu
void fct(int a) { cout <<a<<functia 1;} void fct(char *a) { cout<<\n<<a= << functia 2;} void main() { char a=A; fct(3);fct(&a); }
28

5. Alocarea dinamic a memoriei folosind new i delete


Operatorii new i delete sunt similari fct. malloc() i free(), dar constituie o metod superioar adaptat POO; Operatorul new poate fi folosit n urmtoarele situaii: int *ip1, *ip2,*ip3; ip1=new int; // var. intrega neinitializata ip2=new(2); // var. int initializata cu 2 ip3=new[100]; //tablou de 100 de intregi

29

Operatorii new i delete

Operatorul new poate fi folosit i la alocarea dinamic a obiectelor (apelarea constructorului clasei); Operatorul delete este complementarul lui new i permite eliberarea memoriei alocate (apelarea destructorului clasei).

30

6. Operatorul de rezoluie
n C++ este definit un operator de rezoluie ::, a crui principal aplicaie este legat de clase i obiecte. Exemplu: int n=1; void main() { int n=2; afiseaza(n); //afiseaza 2 afiseaza(::n); // afiseaza 1}

31

CLASE N C++

Tipul class

n C++ clasa este un concept fundamental prin care se definesc noi tipuri de date, prin asocierea unui set de funcii la o structur de date; Definirea unei clase presupune declararea ei prin specificarea numelui, lista claselor de baz din care este derivat clasa, dac exist, i membrii clasei- atribute (date) i metode (funcii).

Definirea unei clase antet i corp Antetul este format din cuvntul cheie

class urmat de numele clasei. Corpul clasei este cuprins ntre {} i conine membrii clasei, urmai de ; sau de o list de declarare. Exemplu: class Screen { /* ... */ }; class Screen { /* ... */ } ecranA, ecranB; Datele membre se declar exact ca variabilele C obinuite, exceptnd faptul c nu pot fi iniializate explicit.

Exemplu
class Screen { short row, col; // nr linii i coloane char *cursor; // poziia curent a cursorului char *screen; // matricea ecran, row*col };

Observaii

Este bine ca datele membre s se specifice n ordinea cresctoare a dimensiunii, acest fapt putnd asigura o alocare optim pe toate mainile. Un obiect al unei clase poate fi declarat membru doar dac clasa a fost deja definit. Definirea se ncheie n momentul apariiei }. Nu se pot declara membri de tipul clasei.

Declararea claselor
class nume_tip { modificator_control_acces: lista_membrilor; } lista_variabile; Clasa reprezint un tip de date definit de utilizator; Membrii unei clase sunt: - Atribute datele declarate n cadrul clasei; - Metode funcii membre declarate sau definite n clas.

Modificator control acces


class <nume clasa>{ private: //zona privat- numai a clasei respective; de regul cuvntul private poate lipsi protected: //zona (optional) accesibil clasei i descendenilor ei; public: //interfaa cu lumea exterioar clasei };

Exemplul 1: class dreptunghi


class dreptunghi {
double Lung, lat; public: void seteaza-dimen(double, double); double arata_Lung() {return Lung;} double arata_lat() {return lat;} double calcul_arie() {return Lung*lat;} };

Membrii statici ai unei clase


Fiecare obiect are propriile lui copii ale tuturor membrilor acelei clase. Este posibila definirea de membrii care sa fie folositi n comun de catre toate obiectele clasei. Datele statice exista ntr-o singura copie, comuna tuturor obiectelor. Crearea, initializarea si accesul la aceste date statice sunt total independente de obiectele clasei. Functiile membre statice efectueaza operatii care sunt asociate ntregii clase. Din acest motiv, la apelarea lor nu este obligatorie indicarea unui obiect.

Exemplul 2:
class masina{ char *culoare;//membru implicit private int capacit_cil; // membru private public: void citire_date(); int ret_capacit(); }; culoare si capacit_cil pot fi accesati numai prin metodele clasei.

Exemplul 3
class Persoana{ char *nume; // data privata public: void citire_inf(); // metoda publica private: int varsta; //data privata };

Pointerul this
Fiecare funcie membr are un argument ascuns numit this, transmis automat de ctre compilator. Aceast variabil (local) reprezint pointerul ctre obiectul curent (cel care apelez metoda). S implementm metoda calcul_arie folosind acest pointer.

Exemplu pentru this


class Dreptunghi{ double lung, lat; public: // void seteaza_dimen(double,double); }; void Dreptunghi::seteaza_dimen(double L, double l) {this->lung=L;this->lat=l;}

Obiecte
Un obiect este o instan a unei clase; Exemplu: dreptunghi a; Se pot declara oricate obiecte ale unei clase; Declararea obiectelor are o form asemntoare declarrii datelor de tip predefinit: nume_clasa lista_obiecte; Exemplu: dreptunghi a,b,c; Dreptunghi.cpp

Domeniul unui nume Vizibilitate Timp de via

Domeniul unui nume


Unui nume i corepunde un domeniu, specificat prin declaraia variabilei; n funcie de poziia definirii unui nume, domeniul poate fi:
(dac numele este declarat ntr-un bloc; fiier (dac numele este declarat n afara oricrui bloc sau declaraie de clas); clas;
local

Dac un nume care are ca domeniu un fiier este redefinit ntr-un bloc inclus n domeniul su, el poate fi folosit n acel bloc dac este precedat de operatorul de rezoluie (::);

Exemplu
#include <iostream.h> int i=89; // i declarat in afara oricarei func., // domeniul numelui este fisierul void main() {double i=99.9; cout<<Valoarea lui i=<<i<<\n; // i=89 cout<<Valoarea lui i=<<::i<<\n; // i=99.9 }

Domeniul numelui unui tip de date definit ntr-o clas


Se stabilete n mod similar domeniului oricrei variabile; Numele unui membru al unei clase are un domeniu de tip clas; Ca orice nume, un nume de clas poate fi redeclarat;

Exemplu
class a { // }; //.. { //instructiune bloc aflata in domeniul numelui a double a=99; //redeclararea lui a class::a x; // x este un obiect de tipul a (al clasei a) }

Vizibilitate
Domeniul de vizibilitate al unei variabile (obiect) este determinat de clasa de memorare a varibilei (obiectului) De obicei domeniul de vizibilitate al unui nume coincide cu domeniul numelui.

Variabile locale i variabile globale


Definiii
declarate n afara oricrei funcii sunt variabile globale; Variabilele declarate n interiorul unui bloc sunt variabile locale; Poriunea de cod n care o variabil este accesibil reprezint scopul (domeniul de vizibilitate ) al variabilei respective; Parametrii formali ai unei funcii sunt variabile locale ale funciei respective;
Varibilele

Timpul de via
Timpul de via al unei variabile locale este durata de execuie a blocului (funciei) n care a fost definit; Timpul de via al unei variabile globale este durata de execuie a programului.

Exemplu
int x; //variabila globala, vizibila in tot // programul void main() { int a,b; // variabile locale main() //. } int y; // variabila externa vizibila din acest // punct si pana la sf. fisierului sursa void func1(void) { int c,d; // variabile locale in func1 //.. }

Clase de memorare
Clasa de memorare determin timpul de via i domeniul de vizibilitate al unei variabile Se specific la declararea variabilei, prin unul dintre cuvintele cheie:

auto register extern static

auto int a; register char c; extern double z; static int x;

Clasa de memorare auto


Este clasa de memorare implicit pentru o variabil local dac nu se declar nimic; Se aloc memorie automat la intrarea n blocul sau n funcia n care este declarat. Domeniul de vizibilitate este blocul sau funcia unde a fost declarat; Timpul de via este durata de execuie a blocului sau funciei respective.

Clasa de memorare register


Variabilele din aceast clas au aceeai vizibilitate i timp de via ca i cele din clasa auto; Diferena const n faptul c pentru variabile register compilatorul utilizeaz regitrii interni; Unei variabile register nu i se poate aplica operatorul de refereniere (::);

Clasa de memorare extern


O varibil global are implicit clasa extern, dac nu exist alt declaraie; Domeniul de vizibilitate este din locul declarrii pn la sfritul fiierului surs; Timpul de via este durata execuiei programului; O variabil din clasa extern este automat iniializat la 0.

Clasa de memorare static


Are dou utilizri distincte: Variabile locale statice Dv = blocul sau funcia unde sunt definite; Tv= durata de execuie a programului. Se iniializeaz automat la 0. Variabile globale statice Dv = locul n care au fost definite i pn la sfritul fiierului; Tv = durata execuiei programului.

CONSTRUCTORI I DESTRUCTORI

n C++ se folosesc funcii membre numite constructori i destructori pentru crearea, iniializarea, copierea i distrugerea obiectelor. Constructorii i destructorii sunt funcii membre ale unei clase. Un constructor este o funcie special membr a unei clase i are acelai nume cu acea clas; Are rolul de a iniializa obiectele (instanele acelei clase) atunci cnd sunt create.
2

Constructori i destructori constr_destr.cpp


Complementul constructorului este destructorul- distruge obiectele create; Destructorul are acelai nume cu constructorul, dar precedat de caracterul ~. Obiectele locale sunt create cnd se intr n blocul lor i distruse cnd se termin programul.

#include <iostream.h> int n_obiecte=0; class OB{ public: OB(){ n_obiecte++; cout<<"Numarul obiectelor in viata "<<n_obiecte<<endl; } ~OB(){ n_obiecte--; cout<<"Au mai ramas doar "<<n_obiecte<<" obiecte "<<endl; } };
4

void main() { OB a,b,c; //creez primele 3 obiecte { OB d,e; } // aici distrug d si e { // redeschid alt context OB f; //crez un nou obiect f } // distrug f } // eliberez memoria ocupata de obiectele a,b,c
5

Particulariti specifice constructorilor


Numele coincide cu numele clasei creia i aparine; n declaraii nu se specific nici un tip de rezultat; Pot fi mai muli constructori pentru aceeai clas, deosebirea realizndu-se prin mecanisme de overloading;

Particulariti specifice constructorilor

Pot avea parametri, inclusiv parametri implicii; Un constructor nu poate fi apelatexplicit ntrun program, ci este apelat automat la crearea obiectului din clasa respectiv (static, auto, dinamic) inclusiv pentru obiecte temporare (n cazul alocrii dinamice se folosete operatorul new);

Particulariti specifice constructorilor


Nu se pot utiliza pointeri ctre constructori; Nu pot fi motenii dar pot fi apelai de clasa derivat; Dac un constructor nu are parametri = constructor cu lista vid; Dac o clas nu dispune explicit de constructori definii, complilatorul acionez automat un constructor ca funcie membr public, fiind n acelai timp constructor cu list i corp, ambele vide;
8

Particulariti specifice constructorilor

O clas cu constructor private nu poate avea obiecte. Ea poate fi doar baza unei ierarhii de clase.

Tipuri de constructori

Exist 3 tipuri de constructori care difer prin lista de aparametri:


Constructor de copiere pentru construcii de forma adr1=ad2. Forma acestui constr. este <nume_clasa>(<nume_clasa>&); 2. Constructor cu list i corp vide, echivalent cu constructorul implicit; 3. Constructor de iniializare. Nu are ca parametru un obiect deoarece se ocup de iniializarea obiectelor ce se vor construi. Nu trebuie s existe neaparat identitate ntre nr. de param. i nr. de cmpuri. Se pot folosi i parametri implicii.
1.

10

Scopul folosirii constructorilor


Asigur iniializarea corect a obiectelor dintr-o clas; Asigur unicitatea iniializrii; Au rolul construirii obiectelor, deci a alocrii memoriei; Sunt importani att pentru obiecte statice ct i pentru obiecte din memoria dinamic.

11

Exemplu pentru cele 3 tipuri de constructori Pers.cpp


#include<conio.h> #include<iostream.h> #include<string.h> #define MAX 20 class Adresa{ char nume[MAX],prenume[MAX],strada[MAX]; int numar;
12

public: Adresa() {}; //constr. explicit cu lista si corp //Adresa(Adresa&); //constr. de copiere Adresa(char*, char*, char*, int);//contr.init. void tip_adresa();//metoda de afisare };

13

Adresa::Adresa(char cnume[],char cprenume[], char cstrada[],int inumar) { strcpy(nume,cnume); strcpy(prenume,cprenume); strcpy(strada,cstrada); numar=inumar; } void Adresa::tip_adresa() { cout<<nume<<" "<<prenume<<" "<<"str."<<strada<<" nr."<<numar<<'\n';}
14

void main() { Adresa adr1("Popescu","Ion","Domneasca", 21); Adresa adr2; adr1.tip_adresa(); adr2=adr1; adr2.tip_adresa(); getch(); }
15

Particulariti specifice destructorilor

Numele destructorilor este format din caracterul ~ i numele clasei creia i aparine; n declaraii nu se specific nici un tip de rezultat; Nu are parametri i nu poate fi supradefinit sau solicitat prin program pentru obiecte dinamice cu operatori anume, inclusiv pentru variabile temporale;
16

Particulariti specifice destructorilor


Nu se pot utiliza pointeri ctre destructori; Nu pot fi motenii dar pot fi apelai de clasa derivat; Dac o clas nu dispune explicit de un destructor, compilatorul genereaz un destructor implicit public cu corp vid;

17

Particulariti specifice destructorilor

Se apeleaz implicit pentru obiecte alocate n memoria static la sfritul execuiei programului;
pentru obiectele de pe stiv-n momentul ieirii din blocul n care au fost definite; - pentru obiecte alocate dinamic cu new, la apelarea dealocrii cu delete.
-

18

Ordinea executrii operaiilor la apelarea constructorilor i destructorilor


1. Pentru constructori: - se aloc spaiu m memorie pentru obiectul respectiv; - se execut instruciunile din constructor, dac exist.

19

Ordinea executrii operaiilor la apelarea constructorilor i destructorilor


2. Pentru destructori: - se execut instruciunile din corpul destructorilor, dac exist; - se distruge obiectul elibernd spaiul de memorie. Obsevaie: Ordinea de apelare implicit pentru destructorii unor obiecte este invers ordinii n care au fost construite obiectele n blocul respectiv.
20

Clasa COMPLEX

S se defineasc tipul abstract de date Complex care s aib funcii membru:


Modul Argument

la partea real Accesul la partea imaginar Afiarea unui numr complex; i constructori pentru iniializare i copiere.
Accesul

Fiierul ClsCOMPLEX.h
class Complex { double real; double imag; public: Complex(double x=0,double y=0); //constructor de initializare Complex(const Complex&); //constructor de copiere double modul(); //modulul nr complex double arg(); // argument nr complex double retreal(); // returneaza partea reala a nr. complex double retimag(); // returneaza partea imag a nr. complex void afiscomplex(); void suma(Complex *,Complex *); };

Fcmembre.cpp
#include <math.h> #include <iostream.h> #define PI 3.14159 #include "ClsCOMPLEX.h" //Constructor pentru initializare inline Complex::Complex(double x, double y) { real=x; imag-y; } // Constructor de copiere inline Complex::Complex(const Complex& z) { real=z.real; imag=z.imag; } // Calculeaza modulul nr complex inline double Complex::modul() { return sqrt(real*real+imag*imag); }
3

// Calculeaza argumentul double Complex:: arg() { double a; if(real==0 && imag==0)a=0.0; if(real!=0 && imag!=0)a=atan(imag/real); if(real==0 && imag>0)a=PI/2; if(real==0&&imag<0)a=3*PI/2; return a; } // Returneaza partea reala inline double Complex::retreal() { return real;} // Returneaza partea imaginara inline double Complex::retimag() { return imag;} //Afiseaza numar complex inline void Complex::afiscomplex() {cout<<real<<"+"<<imag<<" i"<<'\n';}

Complexe.cpp- program care realizeaz urmtoarele: Citete perechi de numere care reprezint partea real i respectiv imaginar a unui numr complex; Afieaz:

Numrul complex citit; - Modulul fiecrui numr complex citit; - Suma numerelor complexe citite.
-

void main() { float re; float im; cout<<"Partea reala ";cin>>re; cout<<"Partea imaginara ";cin>>im; Complex z1(re,im),z2(5,8),z3; cout<<"Primul numar complex"<<'\n';z1.afiscomplex(); cout<<"Modulul= "<<z1.modul()<<'\n'; cout<<"Argumentul= "<<z1.arg()<<'\n'; cout<<"Al doilea numar complex"<<'\n'; z2.afiscomplex(); z3.suma(&z1,&z2); cout<<"Suma numerelor complexe este "<<'\n'; z3.afiscomplex(); }

Funcii friend

Se poate permite unei funcii care nu este membr s aib acces la membrii private i protected ai clasei creia i este prieten (friend). Pentru a declara o funcie friend se include prototipul ei n acea clas, precedat de cuvntul cheie friend.

Spre deosebire de funciile membre funciile friend nu posed pointerul this implicit. Acest lucru conduce la faptul c o funcie friend are un parametru n plus fa de o funcie membru care are acelai efect. O funcie poate fi n acelai timp funcie membr a unei clase i prieten a altei clase.

Exemplu
class CLS1 { int f1(int, char); // f1 metoda a clasei CLS1 // }; class CLS2 { friend int CLS1::f1(int, char); // f1 friend // clasa CLS2 };

n cazul n care se dorete ca toate funciile membre ale unei clase s aib acces la membrii privai ai altei clase (s fie funcii prietene), prima clas poate fi declarat clas prieten pentru cea de-a doua.

10

Exemplu class CLS1; class CLS2 { //. friend CLS1; // CLS1 este clasa prietena CLS2 // };

11

Relaia de clas prieten nu este tranzitiv. Astfel, dac clasa CLS1 este clas prieten a clasei CLS2, iar clasa CLS2 este clas prieten clasei CLS3, aceasta NU implic faptul c CLS1 este clas prieten pentru CLS3.

12

Modificatorii de protecie nu au nici o influen asupra unei funcii prietene; De aceea, specificarea faptului c o funcie este prieten pentru o clas poate fi scris n orice punct din interiorul definiiei clasei respective. Funcia prieten nu este protejat i deci poate fi utilizat fr nici o restricie, ca o funcie obinuit.

13

S se scrie o funcie care ridic un numr complex la o putere ntreag pozitiv. Formula lui Moivre: (r*(cos(a)+isin(a)))**n=r**n(cos(n*a)+isin(n*a) unde: a=argumentul numarului complex; r=modulul nr. complex.

14

Funcia cputere
void cputere(Complex& z,int n) { double r,a; r=z.modul(); a=z.arg(); double rlan=pow(r,(double)n); double na=n*a; z.real=rlan*cos(na); z.imag=rlan*sin(na);}
15

Observaie
Funcia cputere nu este o funcie membr a clasei Complex; Ea are acces la atributele real i imag ale obiectului de tip complex referit de z, numai dac este o funcie prieten a clasei Complex.

16

Motenirea-ierarhii de clase n C++

Mecanismul motenirii

Caracteristic a limbajelor POO, care permite refolosirea i extinderea funcionalitii claselor existente; Permite crearea unei ierarhii de clase i trecerea de la clase generale la clase particulare; Procesul implic la nceput definirea clasei de baz, care stabilete proprietile comune.
2

Motenirea poate fi:

Unic- o clasa are doar o superclas, rezultnd o structur arborescent; Multipl o clas are mai multe superclase, rezultnd o structur de reea. nformaia comun apare n clasa de baz, iar informaia specific, n clasa derivat.
3

Clasa derivat reprezint o specializare a clasei de baz; Orice clas derivat motenete datele membre i metodele clasei de baz; Acestea nu trebuie redeclarate n clasa derivat.
5

Nivelul de acces la membrii unei clase


private membrii (date i metode) pot fi accesai doar prin metodele clasei; protected membrii pot fi accesai prin funciile membre ale clasei i funciile membre ale clasei derivate; public membrii pot fi accesai din orice punct al domeniului de existen al clasei respective; friend membrii pot fi accesai prin funciile membre ale funciei prietene specificate.
6

Tipul de motenire

Public n clasa derivat, nivelul de acces al membrilor este acelai ca n clasa de baz. Privat membrii protected i public din clasa de baz devin private n clasa derivat. Protejat (compilatoare mai noi) la fel ca n motenirea privat, dar membrii publici ai clasei de baz devin protejai n timpul derivrilor ulterioare.
7

Clase derivate

O clas derivat include toate caracteristicile clasei de baz i n plus atribute proprii; La declarare se specific o list a claselor de baz, precedate de modificatorul de acces care precizeaz tipul motenirii.
9

Forma general a motenirii


class <nume_clasa_deriv>:<acces> <clasa_baza>{ // corpul noii clase }; <acces>:private, protected, public Obsevaii: O clas derivat are acces att la proprii membri ct i la membrii publici ai clasei de baz.

10

Exemplu:
class Cladire{ //clasa derivata din cladire int camere, etaje, supraf; class Casa : public Cladire { public: int dormitoare, bai; void nr_camere (int num); public : int cate_camere(); void nr_dormitoare(int num); void nr_etaje (int num); int cate_dormitoare (); int cate_etaje (); void nr_bai (int num); void nr_supraf (int num); int cate_bai (); int cate_supraf(); }; };
11

Declararea clasei derivate Angajat, clasa de baz Persoana (motenire simpl)


class Persoana{ // corpul clasei }; class Angajat:protected Persoana{ double salariu; };
12

Declararea clasei derivate Interfaa, cu clasele de baza Fereastra i Meniu Motenire multipl
class Fereastra { // membrii clasei }; class Meniu { //membrii clasei }; class Interfata:public Fereastra, public Meniu{ //membrii clasei };

13

Compilarea i editarea de legturi

Clasa derivat i clasa de baz pot fi declarate n acelai fiier surs sau n fiiere diferite.

14

Constructorii claselor derivate

Constructorii i destructorii sunt funcii membre care nu se motenesc. La instanierea unui obiect din clasa derivat se apeleaz mai nti constructorii claselor de baz, n ordinea n care acetia apar n lista din declararea clasei derivate.
15

La distrugerea obiectelor, se apeleaz prima dat destructorul clasei derivate, apoi destructorii claselor de baz.

Transmiterea argumentelor unei funcii constructor din clasa de baz se face folosind o form extins a declaraiei constructorului clasei derivate, care transmite argumentul unuia sau mai multor constructori din clasa de baz.
16

Concluzii

n general, clasele utilizeaz constructori definii de programator; Dac acetia lipsesc, compilatorul genereaz automat un constructor implicit pentru clasa respectiv;

17

La instanierea unui obiect o parte din valorile primite ca parametri folosesc la iniializarea datelor membre ale clasei de baz, iar restul iniializeaz datele clasei derivate.

18

Relaia dintre constructorii i destructorii claselor de baz i ai clasei derivate


Motenire n C++

Constructorii i destructorii sunt funcii membru care nu se motenesc; La instanierea unui obiect al unei clase derivate se apeleaz att constructorii clasei derivate ct i cei ai claselor de baz; La nceput, se apelez constructorii claselor de baz i apoi constructorul clasei derivate;
2

Ordinea de apel a constructorilor corespunde cu ordinea n care sunt indicate clasele respective n lista_claselor_de baz din definiia clasei derivate; La distrugerea unui obiect al clasei derivate, destructorii se apelez n ordinea invers; Deci, nti se apelez destructorul clasei derivate i apoi se aplelez destructorii claselor de baz n ordinea invers fa de ordinea de apel a constructorilor la instanierea obiectului respectiv;
3

La instanierea unui obiect se transmit valori parametrilor constructorilor pentru iniializarea datelor membru; n cazul unui obiect al unei clase derivate, o parte din valori se folosesc pentru iniializarea datelor membru specifice ale clasei derivate, iar restul pentru iniializarea datelor membru ale claselor de baz;
4

Constructorul clasei derivate conine parametri pentru toate valorile care se utilizeaz la iniializarea obiectelor; Transferul valorilor de iniializare pentru datele membru ale claselor de baz se definete cu ajutorul antetului constructorului clasei derivate;
5

Fie A o clas derivat din clasele de baz B1, B2,...,Bn:


class A:public B1,public B2,...,public Bn { A(); // prototip pentru constructor }; Constructorul A are un antet de forma: A::A():B1(),B2(),,Bn()
6

Constructorul A are o list de parametri complet, adic pentru iniializarea tuturor datelor membru ale unui obiect de tip A; Expresia Bi(...) (i=1,2,..,n) din antetul constructorului A conine, n parantez, o list de expresii care definesc valori iniiale pentru datele membru ale clasei Bi. Dac o clas Bi nu are constructor, atunci pentru clasa respectiv nu va fi prezent o expresie de forma Bi(...) n antetul constructorului A.
7

De asemenea, expresia respectiv nu va fi prezent n antetul lui A dac datele membru ale clasei Bi se iniializeaz cu valori implicite sau clasa Bi nu are date membru; Expresia Bi(...) este un apel explicit al uni constructor al clasei Bi. Ordinea n care se scriu expresiile Bi(...) n antetul constructorului A este arbitrar; Constructorii se apelez ntotdeauna n ordinea n care sunt scrise clasele n lista_claselor_de_baz.
8

O condiie esenial pentru a se putea apela constructorii claselor de baz prin intermediul clasei derivate este ca acetia s aib protecia de tip protected sau public. Lista care definete apelurile constructorilor claselor de baz nu este prezent n prototipurile constructorilor claselor derivate ci numai n antetele acestora.
9

n general, clasele au constructori definii de programatori; Totui exist situaii n care o clas nu are constructori definii; n acest caz, complilatorul genereaz n mod automat un constructor implicit (far parametri) pentru clasa respectiv.

10

Exemple
1. Clasa A este o clas derivat din clasa de baz B. Nici una din clase nu are un constructor, Fie instanierea: A a; Obiectul a se instaniaz far a se face iniializri. La instaniere se aplic constructorii implicii ai claselor, generai de compilator.
11

Exemplul 2
Clasa A este o clas derivat a clasei de baz B; Clasa B are constructor cu toi parametri implicii: class B { protected: double x,y;

12

public: B(double p=0,double q=0) { x=p; y=q; } }; Clasa A nu are constructor:


13

class A:public B{ protected: Boolean ecran; public: interior(); }; Fie declaraia: A a;


14

Obiectul a se instaniaz apelnduse constructorul cu parametri implicii al clasei B. Datele membru x i z se iniializeaz cu valoarea 0, iar data membru ecran nu este iniializat.

15

Exemplul 3
Clasa A este o clas derivat a clasei B. Clasa B nu are constructor definit. class B { protected: double x,y; public: . // nu exista constructori };
16

Clasa A nu are constructor: class A:public B { protected : Boolean ecran; int abs,ord; public: A(double p=0,double q=0,int lx=639,int ly=349) { // initializeaza datele membru ale clasei de baza x=p; y=q;
17

// initializeaza datele membru specifice abs=lx; ord=ly; if(0<=p && p<=lx && 0<=q && q<=ly) ecran=true; else ecran=false; } };
18

Exemple de instanieri
A a; /* a.x=0, a.y=0, a.abs=639, a.ord=349, a.ecran=true */ A b(100,400); /* b.x=100, b.y=400, b.abs=639, b.ord=349, b.ecran=false */

19

Exemplul 4
Clasa A este o clas derivat a clasei B i ambele clase au constructori definii. class B { protected: double x,y; public: B(double xx=0,double yy=0) { x=xx; y=yy;} };
20

class A:public B { protected: Boolean ecran; int abs,ord; public: A(double p=0,double q=0,int lx=639, int ly=349):B(p,q) { abs=lx; ord=ly;
21

if(0<=p && p<=lx && 0<=q && q<=ly) ecran=true; else ecran=false; } }; Se pot utiliza aceleai instanieri ca n exemplul 3. Se realizeaz aceleai instanieri ca n exemplul 3.
22

Observaie: Datele abs i ord pot fi instaniate chiar n antetul constructorului ca mai jos: A(double p=0,double q=0, int lx=639, int ly=349):B(p,q),abs(lx),ord(ly) { if(0<=p && p<=lx && 0<=q &&q<=ly) ecran=true; else ecran=false; } };
23

Observaii
O clas derivat este necesar s aib cel puin un constructor n cazul n care cel puin o clas de baz are un constructor care nu este implicit sau nu are toi parametrii implicii; Exemplele 1- 4 au fost analizate avndu-se n vedere constructori obinuii (nu de copiere !). n lipsa constructorilor de copiere, compilatorul genereaz n mod automat constructori implicii, care, copiaz datele membru ale obiectului surs n datele membru ale obiectului destinaie. O copiere de acest tip se numete copiere bit cu bit.
24

Constructorii de copiere sunt necesari mai ales n cazul n care clasele au ca date membru pointeri spre zonele alocate dinamic n memoria heap; De asemenea, n condiiile motenirii unor date membru ale claselor de baz, pot aprea situaii n care copierea bit cu bit ar genera erori.

25

Supra ncrcarea Supra operatorilor


n C++

n C++ tipurile abstracte de date se definesc cu ajutorul claselor, dar nu se comport la fel ca tipurile predefinite; Totui, exist o serie de asemnri:
Datele de tip abstract (obiectele) se declar la fel ca cele de tip predefinit; De asemenea, ele pot fi iniializate la declarare.

n cazul tipurilor abstracte, operaiile se definesc cu ajutorul funciilor membre i funciilor friend.

Exemplu

Pentru clasa COMPLEX se pot defini funcii membru i funcii friend pentru a realiza cele 4 operaii aritmetice asupra obiectelor de tip COMPLEX. n definiia de clas de mai jos se folosete o funcie membru i una friend pentru adunarea, respectiv scderea obiectelor de tip COMPLEX.
3

class COMPLEX { double real,imag; public: COMPLEX(double x=0,double y=0) //constructor de initializare { real=x; imag=y; } //functie membru pentru adunarea obiectelor de tip complex COMPLEX adcomplex(COMPLEX& z2); //Functie friend pentru scadere friend COMPLEX sccomplex(COMPLEX&, COMPLEX& ); ... };

n continuare se pot defini funciile adcomplex i sccomplex ca mai jos: COMPLEX COMPLEX::adcomplex(COMPLEX& z) //returneaza suma dintre obiectul curent // si cel transmis prin parametrul z { COMPLEX ztemp; ztemp.real=real+z.real; ztemp.imag=imag+z.imag; return ztemp; }

COMPLEX sccomplex(COMPLEX& z1,COMPLEX& z2) //returneaza diferenta z1-z2 { COMPLEX ztemp; ztemp.real=z1.real-z2.real; ztemp.imag=z1.imag-z2.imag; return ztemp; } Dac a,b,c sunt 3 obiecte de tip Complex instaniate cu ajutorul declaraiei: Complex a,b,c; atunci instruciunea c=a.adcomplex(b); atribuie lui c de tip Complex rezultatul sumei obiectelor complexe a i b.

De menionat c apelul a.adcomplex(b) returneaz un obiect de tip Complex la fel cum o funcie de antet tip nume_f(...) unde tip este un tip predefinit diferit de void returneaz o valoare de tip tip. n general dac ob1 i ob2 sunt obiecte din clasa CLASA: CLASA ob1,ob2; atunci o expresie de forma ob1=ob2 este admis de complilator i ea atribuie lui ob1 valoarea obiectului ob2.

Aceast atribuire se realizeaz prin copiere bit cu bit a valorilor componentelor lui ob2 n zonele de memorie alocate componentelor lui ob1. Cu toate acestea, tipul COMPLEX definit nu permite utilizarea operatorilor obinuii pentru a exprima operaii cu obiecte de tip COMPLEX ca n cazul operaiilor cu numere de tip int, long, float sau double.

Acest lucru este posibil prin mecamismul de suprancrcare a operatorilor. Operatorii +i trebuie suprancrcai pentru a realiza operaii corespunztoare cu obiecte de tip COMPLEX.

Ca rezultat al suprancrcrii se ajunge ca operatorii respectivi s poat fi utilizai n expresii obinuite cu operanzi obiecte de tipuri abstracte. Limbajul C++ permite suprancrcarea numai a operatorilor existeni n limbaj cu excepia operatorilor: . :: ? :

10

De asemenea, prin suprancrcare nu se poate schimba naritatea (unar sau binar), prioritatea sau asociativitatea operatorilor, acestea fiind elemente predefinite care se pstreaz i pentru tipurile abstracte.

11

Suprancrcarea operatorilor se realizeaz cu ajutorul unor funcii membre sau prietene, speciale. Specificul lor const n numele acestora. El se compune din cuvntul cheie operator i unul sau mai multe caractere care definesc operatorul care se suprancarc.

12

Suprancrcarea operatorului + pentru tipul COMPLEX


Complex Complex::operator +(Complex& z) //returneaza un obiect complex care este // suma dintre obiectul curent si cel //transmis prin z { Complex temp; temp.real=real+z.temp; temp.imag=imag+z.imag; return temp; } n acest caz numele funciei este operator + , iar n rest funcia este identic cu funcia membru adcomplex definit mai nainte.

13

Efectul schimbrii numelui din adcomplex n operator + este acela al suprancrcrii operatorului + pentru a admite ca operanzi obiecte de tip Complex. Deci, o expresie de forma a+b este legal i are ca rezultat un obiect de tip COMPLEX care reprezint suma dintre a i b.

14

n locul expresiei a.adcomplex(b) care este mai puin sugestiv vom utiliza : c=a+b; n mod analog putem suprancrca operatorul schimbnd numele funciei fiend sccomplex cu operator Se vor utiliza apoi expresii de forma a-b n locul apelului funciei sccomplex(a,b);

15

Supoper.cpp, Supoper1.cpp
Observaii Operatorii pot fi suprancrcai prin funcii membre sau prin funcii friend; O diferena ntre cele dou tipuri const n numrul de parametri; Astfel funciile membru care suprancarc operatori unari nu au parametri, iar cele care suprancarc operatori binari au un singur parametru; n cazul funciilor friend numrul parametrilor este egal cu n-aritatea operatorului care se suprancarc.

16

La suprancarcarea operatorilor pentru obiecte de tip abstract nu se face diferena ntre formele prefixate i cele postfixate. n principiu, funciile membru care suprancarc un operator nu sunt statice cu excepia operatorilor unari new i delete care se suprancarc numai prin funcii membru statice;

17

Ali operatori care prezint particulariti la suprancrcare sunt parantezele, operatorul-> i operatorul de atribuire =. Mai sus, am considerat suprancrcarea operatorilor binari pentru cazul cnd ambii operanzi sunt de tip abstract COMPLEX; Se pune problema utilizrii operatorilor respectivi i cu operanzi diferii adic de forma: a+k, k+a, a-k, k-a unde: k- variabil de tip int, iar a obiect Complex.

18

Exist 2 soluii pentru a utiliza expersii de aceast form: 1. Suprancrcarea operatorului + nu numai pentru operanzi de tip Complex, ci i pentru operanzi diferii; 2. Conversia operandului care nu este de tip Complex ntr-un obiect de tip Complex, nainte de aplicarea operatorului. Acest lucru este destul de simplu dar nu ntotdeauna eficient.

19

Soluia 1
Pentru a legaliza expresii de forma: a+k unde a este obiect Complex iar k o variabil de tip int, putem aduga o nou funcie operator membr sau friend de tipul: Complex Complex::operator +(int k) { Complex ztemp; ztemp.real=real+k; ztemp.imag=imag; return ztemp; } Sau putem defini o funcie friend cu acelai efect:

20

Complex operator + (Complex& z1, int k) { Complex ztemp; ztemp.real=real+k; ztemp.imag=imag; return ztemp; }
21

Adugnd una dintre aceste funcii se pot utiliza instruciuni de forma : Complex a,b; int k; . b=a+k; b=a+123; S observm c funciile de mai sus implic faptul c primul operand este de tip Complex ceea ce nseamn c expresiile de forma k+a 123+a sunt ilegale.

22

Pentru a accepta astfel de expresii este necesar ca operatorul + s fie suprancrcat n mod corespunztor, adic pentru expresii n care primul operand este de tip int i al doilea este de tip Complex.

23

O astfel de suprancrcare se poate realiza dar numai printr-o funcie friend deoarece n cazul funciilor membru, primul parametru este ntotdeauna obiectul curent i acesta nu poate fi de tip int. De aceea pentru a admite expresii n care primul operand este de tip int i al doilea de tip Complex vom utiliza urmtoarea funcie friend:

24

Complex operator + (int k, Complex z) // returneaza obiectul complex k+z { Complex ztemp; ztemp.real=z.real+k; ztemp.imag=z.imag; return ztemp; }

25

Din exemplu se vede c suprancrcarea operatorilor nu permite motenirea proprietii de comutativitate a acestora; Astfel dei operatorul + este comutativ pentru operanzi de tipuri predefinite, suprancrcarea lui pentru expresii de forma a+k unde: - a este obiect de tip Complex - k este variabil de tip int, nu este valabil pentru expresii de tip k+a.

26

FISIERE IN C++

Biblioteca standard a limbajului C++ ofer utilizatorului dou ierarhii de clase pentru operaii de I/E i lucrul cu fiiere. Una are ca rdcin clasa streambuf, iar cealalt, clasa ios. La baz se afl conceptul de stream (flux). Prin stream se nelege un flux de date de la surs ctre o destinaie sau consumator. Clasa streambuf furnizeaz funcii generale pentru lucru cu zonele tampon (bufere) i permite tratarea operaiilor de I/E fr a avea n vedere formatri complexe. Din clasa streambuf deriv clasele strstreambuf i filebuf.
2

Clasa ios are un pointer ctre streambuf. Ea are date pentru a gestiona interfaa cu streambuf i pentru tratarea erorilor. Din clasa ios deriv clasele istream pentru gestionarea intrrilor i clasa ostream pentru gestionarea ieirilor. La prelucrarea fiierelor se folosesc obiecte ale clasei filebuf. Sunt folosite urmtoarele clase: - ifstream folosit pentru operaii de intrare (citire)
3

ofstream folosit pentru operaii de ieire (scriere) - fstream folosit pentru operaii de intrare/ ieire (citire/scriere) Pentru obiectele acestor clase se pot aplica funciile membru ale claselor de baz, inclusiv suprancrcarea operatorilor de inserare i extragere. Prelucarea unui fiier ncepe cu deschiderea lui. n acest scop se poate proceda n 2 moduri:
4

1.

2.

Se utilizeaz funcia open cu un obiect al uneia din clasele ifstream, ofstream sau fstream instaniat fr parametri; Se utilizeaz parametri pentru deschiderea fiierului la instanierea obiectelor; n primul caz, obiectele se instaniaz folosind constructori implicii; De exemplu, fie instanierea: ifstream fisier1; Obiectului fisier1 i se ataeaz un fiier concret la un apel al funciei fisier1.open(...)
5

Funcia open este definit n clasa fstreambase i este suprancrcat n clasele derivate din aceasta. Ea are prototipul: void open(char *fisier,int mod,int protectie); Parametrul fisier este un pointer spre un ir de caractere care definete numele i extensia fiierului care se deschide, precum i calea spre fiierul respectiv, dac nu se afl n directorul curent. Parametrul mod definete modul de deschidere al fiierului. n acest scop se pot folosi enumeratorii definii n clasa ios astfel:
6

in - fiierul se deschide n intrare (citire); out fiierul se deschide n ieire (scriere); ate dup deschiderea fiierului, poziia curent n fiier este sfritul fiierului; acest mod se utilizeaz pentru a face cutri n fiier ncepnd cu sfritul acestuia; app deschidere pentru a aduga nregistrri trunc dac fiierul exist, coninutul lui se pierde i se creaz un fiier nou. Acest mod este implicit cnd este prezent opiunea out (deschidere n scriere) i este incompatibil cu opiunile ate i app;
7

nocreate dac fiierul exist i este prezent opiunea out, atunci deschiderea este admis numai dac se utilizeaz opiunea ate sau app. binary fiierul se deschide pentru a putea fi prelucrat binar. n mod implicit fiierele se consider c sunt prelucrate pe caractere (mod text). La deschidere de fiier se pot folosi mpreun mai multe opiuni folosind operatorul sau logic (|)
8

Pentru obiectele clasei ifstream, opiunea in este implicit, iar pentru cele ale clasei ofstream, opiunea out este implicit. Parametrul protectie definete modul de acces la fiier. n mod implicit acest parametru are valoarea zero i aceasta nseamn c fiierul respectiv nu are restricii la acces. Rezultatul operaiei de deschidere poate fi testat cu ajutorul cuvtului de stare al streamului pentru care s-a apelat funcia open.
9

Exemple
1.

ifstream fisier; // se deschide fisierul fis.dat in citire fisier.open(fis.dat,ios::nocreate); // se testeaza starea obiectului fisier dupa deschidere if(fisier){ // deschidere corecta } else{ cout<<Incident la deschidere fisier fis.dat\n; }
10

Exemple

Opiunea ios::in este implicit.

2. ofstream fis_iesire; //se deschide in scriere fisierul factura.dat fis_iesire.open(factura.dat); if(!fis_iesire){ cout<<Incident la deschidere; }

11

Exemple
3. ofstream fis; //se deschide pentru adugare fisierul binar //stoc.dat fis.open(stoc.dat,ios::app|ios::binary); // se testeaza starea obiectului fis dupa deschidere if(!fis){ cout<<Incident la deschidere; } else { //deschidere corecta }
12

Cea de-a doua posibilitate de deschidere a unui fiier este folosirea parametrilor corespunztori la instanierea obiectelor claselor ifstream, ofstream sau fstream. n acest caz constructorul apelat pentru instanierea obiectelor claselor amintite mai sus au aceeai parametri ca i funcia open: nume_clasa(char *fisier,int mod, int protectie) unde: nume_clasa este ifstream, ofstream, fstream. Parametru protectie este i n acest caz un parametru implicit cu valoare zero.

13

Exemplele anterioare pot fi rescrise astfel


1. ifstream fisier(fis.dat,ios::nocreate); if(fisier){ //deschidere corecta } else { cout<<Incident la deschidere; } 2. ofstream fis_iesire(factura.dat); if(!fis_iesire){ cout<<Incident la deschidere; }
14

Exemplul 3
ofstream fis (stoc.dat,ios::app | ios::binary); if(!fis){ cout<<Incident la deschidere; } else { //deschidere corecta }

15

Dup deschiderea unui fiier se pot face prelucrri pe el; Dup terminarea prelucrrii, n conformitate cu modul n care a fost deschis, acesta trebuie s fie nchis; nchiderea se realizeaz cu funcia close. Aceasta se apeleaz astfel: obiect.close(); sau pobiect->close(); unde: obiect este o instan a uneia dintre clasele ifstream, ofstream sau fstream.

16

n mod analog, pobiect este un pointer spre unul din tipurile implementate prin aceste clase. Funciile membre get, getline, put, read i write pot fi folosite pentru a realiza operaii de intrare/ieire cu acces secvenial. Accesul aleator se poate realiza folosind funciile membru specifice ale claselor ostream i istream. Clasa ostream are funciile membru seekp i tellp care pot fi utilizate la realizarea accesului aleator la scrierea nregistrrilor n fiiere.
17

n mod analog, clasa istream are funciile membru seekg i tellg care pot fi utilizate la realizarea accesului aleator la citirea nregistrrilor n fiiere. Funcia tellp returneaz poziia curent din stream fa de nceputul lui. Are prototipul: long tellp(); Funcia seekp realizeaz poziionarea n streamul curent. Are prototipul: ostream&seekp(long n,seek_dir rel=beg); unde: seek_dir se definete n clasa ios astfel:

18

enum seek_dir{beg,cur,end}; Aceti parametri au urmtoarea semnificaie: n deplasament n numr de octei; rel=beg deplasamentul se consider fa de nceputul streamului; rel=cur deplasamentul se consider fa de poziia curent din stream; rel=end deplasamentul se consider fa de sfritul streamului.

19

Funciile membre ale clasei istream au prototipuri i semnificaii similare; long tellg(); istream&seelg(long n,seek_dir rel=beg); De menionat c funciile tellp, tellg, seekp, seekg se pot utiliza i n legtur cu obiecte ale claselor istrstream, ostrstream i strstream.

20

O alt funcie util este gcount, funcie membr a clasei istream. Ea are prototipul: int gcount(); Returneaz numrul de octei citii la ultima operaie de intrare.

21

Aplicaie: fismisc.cpp
S se scrie un program care citete de la intrarea standard datele ale cror formate sunt definite mai jos i le scrie n fiierul misc.dat din directorul curent. Fiierul este organizat binar, fiecare articol coninnd urmtoarele cmpuri:
tip denumire I cablu electric um cod m 123456 pre 10 cantitate 1000

22

Aplicaie : fismisc1.cpp

S se scrie un program care afieaz articolele din fiierul misc.dat creat anterior , pentru tip=I. I=intrari E=iesiri T=transfer

23

Aplicaie: fistext.cpp

S se scrie un program care citete iruri de caractere i le transfer pe disc.

24

S-ar putea să vă placă și