Limbajul c si C++ abc-doar


Nu se pot inventa operatori noi,dar dintre cei existenti,majoritatea



Yüklə 4,6 Mb.
səhifə3/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   2   3   4   5   6   7   8   9   ...   55

Nu se pot inventa operatori noi,dar dintre cei existenti,majoritatea

pot fi supraincarcati,adica pot capata valente noi in cadrul unei

anumite functii sau a unui anumit obiect(clasa).Astfel redefiniti,in

cadrul clasei respective,operatorii vor fi interpretati cu noua

definitie.Operatorii supraincarcati vor fi tratati ca functii,si pot

fi membrii ai unei clase sau functii globale.

Pentru supraincarcarea unui operator se utilizeaza expresia operatorx,

unde "x" reprezinta simbolul operatorului,care poate fi unul dintre:

(, ! != % %= & && &= () * *= + ++ += - -- -= -> ->* / /= < << <<= <=

= == > >= >> >>= [] ^ ^= | |= || ~ delete si new)

Urmatorii operatori nu pot fi supraincarcati:

( . .* :: ?: # ##)
EXEMPLU: Point pt;

pt.operator+( 3 );

in acest exemplu,operatorul de sumatie + va adauga cate trei elemente

In cazul operatorilor care pot fi utilizati atat in sistem ASCII cat

si in sistem binar,operatorul poate fi supraincarcat separat pentru

fiecare tip de date.

Pentru supraincarcarea unui operator se poate utiliza o functie non-

statica sau o functie globala care este "friend" pentru clasa respec-

tiva.

Nu se poate modifica precedenta unui operator,(sau grup de operatori)

si nici numarul de operanzi asupra carora actioneaza.

Nu se pot supraincarca operatorii care actioneaza asupra datelor fixe.

Operatorii supraincarcati nu pot avea valori implicite.

Nu se pot supraincarca operatorii de preprocesor.

Operatorii de atribuire(cei care contin si semnul =) nu pot fi supra-

incarcati decat ca membri ai unei functii nonstatice(nu si prin fun-

ctii friend) si nu pot fi mosteniti (orice clasa derivata din clasa

de baza va utiliza operatorul cu semnificatia lui originala).

EXEMPLU: public:

Complex( float re,float im );

Complex operator+( Complex &other);

in acest caz operatorul + va adauga cele doua numere complexe (complex

si other).

overload

-este perimat,nu mai figureaza in versiunile recente(a fost inlocuit

prin formulari mai explicite.Se refera la supraincarcarea de functii,

operatori,adrese de functii etc.In cazul functiilor,supraincarcarea

se face prin atribuirea de mai multe definitii pentru aceeasi functie

urmand sa fie selectata la compilare cea potrivita tipului de date.


-16- [private-reinterpret_cast]

private

-daca se utilizeaza in fata unei liste de membri ai unei clase,atunci

membri respectivi sunt accesibili doar pentru functiile membrilor din

aceeasi clasa si pentru functiile "friend".Caracterul privat se va

mentine astfel pana cand va fi schimbat explicit cu un alt specifi-

cator.

Daca se specifica in fata unei clase de baza,atunci membri "public"

si "protected" ai clasei respective vor fi membri privati ai claselor

ce deriva din clasa de baza.

Valoarea implicita pentru membrii unei clase este "private" iar pentru

membrii unei structuri sau uniuni este "public".

Accesul implicit la clasele unei clase de baza,este "private" iar la

structurile unui clase de baza este "public".Uniunile nu pot avea

clase de baza.

EXEMPLU: class BaseClass

{ public:

int pubFunc() { return privMem }

private:

void privMem;

};
protected

-daca se utilizeaza in fata unei liste de membri ai unei clase,atunci

membrii respectivi vor fi accesibili doar pentru functiile membrilor

din aceeasi clasa,functiile "friend" si din clasele derivate .

Daca se utilizeaza in fata unei clase de baza,atunci membrii clasei

respective vor fi "protected" in clasele ce deriva din clasa de baza.

EXEMPLU: class BaseClass

{

protected:

int protectFunc();

};

Fata de "private",protejeaza si membrii claselor derivate.
public

-daca se utilizeaza in fata unei liste de membri ai unei clase,atunci

membrii respectivi vor fi accesibil pentru toate functiile (inclusiv

cele din afara clasei respective).

Daca se utilizeaza in fata unei clase de baza,atunci membrii clasei

respective vor fi publici iar cei din clasele derivate vor mentine

caracterul initial (public sau protejat).

EXEMPLU: class BaseClass

{

public:

int pubFunc{ };

};
reinterpret_cast (expresion)

-este un operator si permite ca un pointer sa poata fi transformat in

pointer de orice alt tip de data.Deasemenea permite ca orice tip inte-

gral sa poata fi converitit intr-un pointer,si viceversa.

-17- [static_cast-template]

static_cast (expression)

-converteste expresia din "expressoin" la tipul de date specificat

prin "type-id".

Se poate utiliza de exemplu pentru a converti un pointer de la o clasa

de baza la un pointer spre o clasa derivata.

Operatorul static_cast se poate utiliza si pentru conversii implicite,

conversii standard sau conversii definite de catre utilizator.

EXEMPLU: void f()

{

char ch;

int i=65;

float f=2.5;

double dbl;
ch= static_cast(i) // i din int devine char

dbl=static_cast(f) // f din float devine double

}
template <[typelist][,[arglist]]> declaration

-este un declarator utilizat pentru a declara functii parametrizate.

Lista de parametri ai functiei se declara prin "typelist",separati

intre ei prin virgula sub forma de identificatori ai clasei sau ai

tipului de nume al clasei sau parametri netipizati ce vor fi utili-

zati in cadrul clasei.

Numele functiei sau la clasei la care se aplica se declara prin "de-

claration".Apelarea unei functii template se va face la fel ca si

orice alta functie.

Functiile template sunt utile pentru a crea o clasa de obiecte care

opereaza cu mai multe tipuri de date,in loc de a crea cate o clasa

pentru fiecare tip de date.

EXEMPLU: template T min (T a,T b)

return (a

inlocuieste cu succes o serie de declaratii de tipul:

int min( int a,int b)

return (a

long min( long a,long b)

return (a

char min( char a,char b)

return (a

.....etc. // in care fiecare tip de data se declara distinct

Daca se utilizeaza pentru functii,functiile template vor utiliza

acelasi cod,dar se va putea aplica pentru tipuri de date diferite.

EXEMPLU: template void MySwap( T& a,T& b)

{

T c( a );

a=b; b=c;

}

defineste o clasa de functii cu parametri de tip swap(negociabili).

Clasele template se pot utiliza si pentru a declara o familie de clase

care opereaza asupra unui singur tip de date.

In principiu, se utilizeaza pentru a reduce numarul liniilor de cod.


-18- [this-typeid]

this

-este un pointer accesibil doar in cadrul aceleiasi clase,structuri

sau uniuni."This" dirijeaza controlul spre obiectul pentru care a

fost apelata functia membru respectiva.Functiile statice nu pot avea

poinerul "This"(este inutil).

Atunci cand un obiect este solicitat de catre o functie nonstatica,

adresa obiectului va fi transferata ca si argument "hidden" al

functiei respective (argument ascuns).

EXEMPLU: void Date::set Month( int mn )

{

month=mn;

this->month=mn //cele trei expresii sunt echivalente

(*this).month=mn;

}
throw

-se utilizeaza pentru manevrarea exceptiilor (ca si try si catch).

Operatorul throw se utilizeaza pentru a elibera(arunca la gunoi) o

exceptie dupa ce a fost testata cu try.Operandul lui throw este identic

sintactic cu cel din declaratia return.

Exceptiile eliberate de throw pot fi eventual recuperate cu catch.

EXEMPLU: try

{

file.Write(LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER);

}

catch (CFileException* e)

{

::GlobalUnlock(HGLOBAL)hDib);

throw;

}

::GlobalUnlock(HGLOBAL) hDib;

return TRUE;

o formulare de acest gen se utilizeaza pentru a incerca sa suprascrie

toate filele de un anumit tip,si pentru a recupera dintre cele pe care

nu le poate deschide,pe cele de un tip oarecare.
true

-este un dintre cele doua valori ale unei variabile boleene
try

-se utilizeaza pentru tratarea exceptiilor (vezi throw)

Try este declaratorul prin care se incearca executarea operatiei spe-

cificate,iar in caz de nereusita,exceptiile sunt fie aruncate de catre

throw,fie recuperate de catre catch.
typeid

-este un operator care permite ca tipul unui obiect sa fie determinat

in timpul rularii programului (in functie de necesitati).

Rezultatul este o expresie de tip const type_info& (type_info este o

clasa de obiecte ce contine informatiile generate de program in timpul

operatiei de compilare(transcriere).


-19- [using-wchar_t]

using::unqualified-id

-este un declarator care introduce un nume sinonim pentru o entitate

declarata anterior.Acest procedeu permite ca un nume dintr-un anumit

spatiu de program sa poata fi utilizat fara o declaratie explicita.

Prin contrast,directiva "using" permite ca toate numele dintr-un

spatiu oarecare sa poata fi utilizate fara declaratie explicita.

EXEMPLU: class B

{

void f(char};

void g(char);

};

class D:B

{

using B::f;

void f(int){ f('c'); } //apeleaza B::f(char)

};

Prefixul :: se refera la numele global al spatiului .

Pentru a putea utiliza toate numele dintr-un spatiu fara a mai declara

explicit fiecare dintre ele se poate utiliza o directiva using.

EXEMPLU: namespace M

{ int i;

int f;

}

using namespace M
virtual

-declara o functie virtuala sau o clasa de baza virtuala.

O functie virtuala este o functie membru al unei clase,care va astep-

tati sa fie redifinita in clasele derivate din cea de baza(pregateste

locul pentru o functie ce urmeaza sa fie redefinita).

EXEMPLU: class WageEmployee

{

public:

virtual float computePay();

};

O clasa de baza virtuala,asigura spatiul pentru o functie ce urmeaza

sa fie definita ulterior si in acelasi timp asigura ordinea ierarhica.
wchar_t

-este un tip de date interne pentru caractere mari si se utilizeaza

pentru scrierea de programe portabile pentru pietele internationale.

Este continut in bibliotecile STDDEF.H si STDLIB.H.

Datele de acest tip sunt obiecte unsigned short (pe 16 biti).

Poate apare ca specificator in declaratiile const,typedef,generale si

in declararea functiilor.La pointerii si ariile de tip wchar_t se

poate utiliza si atributul "string".

Daca se utilizeaza si caracterl L inaintea unui caracter sau sir de

tip wchar_t,atunci se specifica faptul ca este o constanta.

EXEMPLU: wchar_t text

Daca se utilizeaza MIDL(Microsoft Interface Definition Language),este

posibila redefinirea datelor wchar_t(doar daca convine definitiei).


-20-

Cuvintele cheie prezentate mai sus,reprezinta doar scheletul de orga-

nizare a libmajului C.Ele pot fi privite ca si niste functii predefinite

care nu mai au nevoie de interpretor,ci se adreseaza direct procesorului.
COMENTARII
In editarea unui program,pentru explicitarea formularii sau pentru

simplificarea operatiilor de modificare sau depanare,se pot utiliza si

linii de text care contin comentariile necesare.Pentru acest scop,se vor

utiliza combinatiile de caractere: /* -pentru inceperea unui comentariu

si respectiv */ pentru incheierea unui comentariu.

EXEMPLU: /* Acesta este un comentariu ! */

Comentariile vor fi ignorate de catre compilator si nu influenteaza cu

nimic executia programelor (cresc doar spatiul de memorie ocupat).

Un comentariu poate include orice tip de caracter,dintre cele recunos-

cute de interpretor si pot ocupa si mai mult decat o linie de program si

pot fi incluse in orice loc in care se poate insera in program un spatiu

nul(compilatorul trateaza comentriul ca pe un spatiu nul).

Comentariile nu pot fi incluse in interiorul unui token(de exemplu in

interiorul unei functii sau in interiorul unui alt comentariu).Si comen-

tariile reprezinta un token,echivalent unui spatiu nul.Pot fi incluse pe

aceeasi linie cu o linie de coduri.Pot preceda functiile declarate.

Daca utilizati un compilator Microsoft,comentariile scrise pe o singura

linie pot fi semnalate doar cu combinatia //.

EXEMPLU: // acesta este un comentariu!

Pentru unele compilatoare(de exemplu /Za(ANSI) acest gen de editare va

genera mesaje de eroare.
IDENTIFICATORI

Identificatorii sau simbolurile,sunt nume pe care le atribuiti unor

variabile,tipuri de date,functii sau etichete din program.Identificatorii

trebuie sa fie diferiti de cuvintele cheie(in general de cuvintele rezer-

vate).Dupa declarare,un identificator va putea fi utilizat in program

pentru referire la entitatea cu care este asociat.

Pentru formarea identificatorilor se pot utiliza cifre si litere sau

liniuta de subliniere,dar primul caracter de denumire nu poate fi o cifra

(va fi obligatoriu un caracter sau o liniuta de subliniere).

Identificatorii externi(globali),care pot fi apelati in orice loc al

programului pot fi formati din maxim sase caractere distincte,iar identi-

ficatorii interni (care pot fi apelati doar in cadrul functiei respective)

pot fi formati din maximum 31 de caractere distincte.Pentru a putea fi

manevrati de catre alte programe(linker),identificatorii declarati ca

externi pot fi supusi eventual si altor restrictii (cazuri particulare).

Standardul ANSI(recunoscut de toate variantele de program),poate fi difer-

it de la un program la altul.Astfel,compilatorul C Microsoft permite cate

247 de caractere distincte,atat pentru identificatorii interni cat si

pentru cei externi.

Majusculele sunt tratate ca si caractere distincte fata de corespon-

dentul lor minuscul.

EXEMPLU : Denumire1 este diferit de denumire1


-21-

Majoritatea compilatoarelor utilizeaza pentru declararea unor varia-

bile interne combinatii de caractere ce incep cu o liniuta de subliniere

urmata de o majuscula sau cu doua liniute de subliniere.Pentru a evita

conflictele de denumire generate aleator,este bine sa evitati aceste

combinatii in formarea denumirilor (chiar daca sunt legale).

EXEMPLE corecte: Nume1,num1,Functie1,funxx,_123var,cod_557

incorecte: 1nume,cont...23,cod?!?

nerecomandate: __nume,_Nume,_cod
CONSTANTE
O constanta este un numar,un caracter sau un sir de caractere ce poate

fi utilizat in cadrul programului cu valoare fixa.Se utilizeaza pentru

a reprezenta numere intregi sau cu virgula mobila,enumarari si valori de

tip caracter(texte),care nu pot fi modificate in timpul executiei.

Orice constanta are o valoare si un anumit tip de data.
SIRURI DE CARACTERE
Sunt formate din secvente de caractere incluse intre ghilimele (").

Se utilizeaza pentru a reprezenta secvente de caractere,care vor fi

tratate de catre procesor la fel ca si un sir nul (token).

Sirurile lungi trebuie precedate de caracterul L.

EXEMPLE: char mesaj="Acesta este un sir"

char mesaj2=L"Acesta este un mesaj utilizat pentru semnalizare!"
SEMNELE DE PUNCTUATIE
Semnele de punctuatie utilizate pentru editarea programelor sunt:

[] () {} * , : = ; ... #

Atunci cand unul dintre ele are si caracter de operator (exemplu:*),com-

pilatorul va interpreta semnificatia lui in functie de pozitia din pro-

gram.

[] -parantezele drepte sunt utilizate pentru a desemna elementele

unui camp de date (arie unidimensionala).Un element inclus intre paranteze

drepte,apartine unei arii.

() -se utilizeaza pentru a incude operanzii unei ecuatii fara a

modifica tipul sau valoarea expresiei incluse (Exemplu: (10+5)/3 ) dar

pentru a ordona secventa operatiilor.

{} -se utilizeaza pentru gruparea instructiunilor

* -desemneaza un pointer (operator indiract)

, -separa elementele unei liste intr-o declaratie

: -precedeaza o definitie (anunta o definitie)

= -executa operatii de atribuire sau de alocare

; -continua executia fara salt la linia urmatoare

... -declara functii cu mai putine argumente decat in definitie

# -este operator de preprocesare(incarca bibliotecile de functii)

Punctuatorii au semnificatie sintactica si semantica pentru compilator,dar

nu au in sine valori de operator (decat daca sunt utilizati in expresii)

C++ accepta urmatorii punctuatori(izolati sau in combinatii):

! % ^ & * () | ~ [] \ ; ' : " <> ? , . / #


-22-

STRUCTURA PROGRAMELOR
Fila care contine codurile programului se numeste sursa programului.

Sursa programului poate fi eventual fragmentata in mai multe file sursa

(in acest mod este posibil ca anumite functii sa apeleze procesoare di-

ferite si sa ruleze simultan).Atunci cand componentele sunt in file se-

parate este necesar ca filele sa fie legate intre ele prin programe

speciale (linker).

Un program sursa scris in limbaj C contine directive de compilare

(#pragma),comenzi,declaratii,definitii,blocuri de instructiuni sau obiecte

functii etc.Componentele programului trebuie sa respecte regulile de sin-

taxa,dar pot sa figureze in program in orice ordine.Ordinea de aparitie

in program poate afecta totusi modul de executie al functiilor si vari-

abilelor.

Programul sursa nu trebuie neaparat sa contina comenzile executabile.

Este posibil ca toate functiile sa fie grupate intr-o singura fila,iar

bazele de date asupra carora actioneaza sa fie in alta fila(sau in mai

multe file).In acest fel,actualizarea bazei de date,sau depanarea si

transformarea programelor este mult mai usoara.

In general,limbajul si compilatorul C si C++ au fost concepute pentru

programarea modulara,iar dezvoltarea limbajului s-a facut prin adaugarea

de module noi.

Orice program C are o functie primara (principala) care poarta numele

de main()(sau eventual wmain).Functia main constitue punctul de pornire

in executia oricarui program.De obicei controleaza executia prin apelari

directe a altor functii din program.Dupa executarea tuturor comenzilor

din functia main(),programul se opreste(daca nu a fost oprit la un alt

nivel).Pentru a forta terminarea unui program inainte de epuizarea comen-

zilor se poate utiliza functia exit.Cand functia main() apeleaza o alta

functie,controlul este transferat functiei apelate,pana la terminarea

executiei,dupa care controlul se returneaza la functia main().Functia

main() poate fi parametrizata,la fel ca orice alta functie.

EXEMPLU: main( int argc,char*argv[],char*envp[])

argc,argv si envp sunt denumirile traditionale pentru parametrii functiei

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin