Nu se pot inventa operatori noi,dar dintre cei existenti,majoritatea
səhifə 3/55 tarix 07.05.2018 ölçüsü 4,6 Mb. #50260
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
Dostları ilə paylaş: