Limbajul C++ si oop abc-doar


Observati o alta noutate fata de limbajul C.In C++ variabilele si



Yüklə 1,36 Mb.
səhifə2/18
tarix12.09.2018
ölçüsü1,36 Mb.
#81721
1   2   3   4   5   6   7   8   9   ...   18

Observati o alta noutate fata de limbajul C.In C++ variabilele si

constantele locale pot fi declarate in corpul functiei,in orice loc,

dar inainte de a fi apelate.Ca rezultat,programatorul are o libertate

de miscare mai mare,dar trebuie sa respecte aceleasi reguli ca si in C

(identificatorul trebuie sa fie unic,sa nu fie cuvant cheie etc...).

Pentru a realiza o functie de intrerupere,am utilizat in acest caz functia

getch(),care asteapta apasarea unei taste oarecare.

In cazul operatiilor de intrare/iesire,supraincarcarea operatorilor

<< si >> are un rezultat extrem de spectaculos si foarte practic.Ope-

ratiile de intrare-iesire sunt foarte numeroase si procedeul tehnic este

perfect justificat.Asta nu inseamna ca trebuiesc supraincarcati toti

operatorii dupa bunul plac al fiecarui programator.In mod normal se va

evita supraincarcarea si orice alt procedeu tehnic care se preteaza la

interpretari ambigue,sau la modalitati de expresie confuziva.Pentru

ca analiza si depanarea programelor sa poata fi facuta cu programe spe-

cializate,este bine sa respectati standardul de limbaj atunci cand editati

programe sau unitati de functii de interes general.

Chiar daca variabilele locale sunt foarte usor de introdus,nu inseamna

ca trebuie abuzat.Compilatorul plaseaza fiecare variabila nou declarata

la o anumita adresa de memorie si apoi citeste valoarea arhivata ori de

cate ori este necesar.Pentru a realiza acest deziderat,ori de cate ori

este apelata o variabila,procesorul va cauta in memorie pana cand gaseste

identificatorul si apoi returneaza valoarea.Cu cat sunt mai multe varia-

bile cu atat sunt mai multe operatii care trebuiesc executate.Cu cat

sunt mai multe variabile,cu atat durata de executie se prelungeste,uneori

absolut inutil.Unele sisteme de operare simplifica aceasta operatie prin

utilizarea unor tabele de pointeri in care fiecare variabila nou declarata

este introdusa in tabel impreuna cu adresa de memorie la care este arhi-

vata.In acest fel,procesorul nu va mai executa "un dans nebun" prin me-

morie ci va citi direct din tabela de pointeri adresa de memorie la care

se gaseste variabila respectiva (viteza de operare creste substantial).


-7-

Asadar,un pointer este o variabila care arhiveaza adresa de memorie a unei

alte variabile.Pentru a citi adresa de memorie a unei variabile se poate

utiliza si operatorul "&",dar,utilizarea pointerilor permite si accesul

direct la valoarea arhivata la adresa respectiva.Cu alte cuvinte,proce-

sorul nu mai trebuie sa caute o variabila prin toata memoria ci "sare"

direct la adresa la care este arhivata.

Pentru aplicatiile banale,in care se utilizeaza cateva variabile si

un numar limitat de operatii,utilizarea pointerilor nu se justifica si

nici nu ofera optimizari spectaculoase (un procesor modern executa cateva

miliarde de operatii pe secunda).In schimb,in cazul programelor mari si

al unitatilor de functii care urmeaza sa fie utilizate de un numar mare

de utilizatori,fiecare astfel de operatie se multiplica exponential,astfel

incat utilizarea pointerilor devine justficata sau chiar imperioasa.

Ca rezultat,majoritatea functiilor implementate in unitatile standard

lucreaza cu memoria prin intermediul pointerilor (chiar daca acest fapt

este sau nu este evident).Reciproc,in cazul in care doriti sa editati

programe si functii de uz general (sau comerciale),va trebui sa optimizati

la maximum operatiile executate asupra memoriei (inclusiv prin pointeri).

Pentru exercitiu,incercati sa va imaginati ce ar insemna cautarea unei

adrese de Internet fara sistemul de adrese TCP/IP.Acelasi lucru se poate

intampla si in cazul unui program complex,cu numeroase obiecte,care ape-

leaza mai multe baze de date.Fara un sistem riguros de ordonare a adrese-

lor,aceste operatii ar fi extrem de greu de realizat.

EXEMPLU: (vezi si cplus3.cpp)

#include

#include

main()

{ float numar1,numar2;

cout << "Introduceti un numar oarecare! \n";

cin >> numar1;

cout << "Introduceti al doilea numar: \n";

cin >> numar2;

cout << "\n adresa de memorie este: " << &numar1;

float *pointer=&numar2;

cout << "\n si respectiv: " << pointer;

cout << "\n Valoarea pointerului este: " << *pointer;

cout << "\n\n Apasati orice tasta !";

getch();

return 0;

}

Asadar pentru declararea unui pointer se utilizeaza "*" iar pentru a

prelua valoarea pointerului (arhivata la adresa pointata) se utilizeaza

tot "*" urmat de identificator.Pointerul poate fi orientat spre un alt

pointer,caz in care se va exprima prin **pointer.Acest gen de exprimare

se poate preta si la confuzii,mai ales in operatiile aritmetice in care

se executa si operatii de inmultire,dar,cu putina rabdare,se poate des-

cifra orice expresie,idiferent cate semne "*" contine.

Stream-urile si pointerii sunt notiunile cele mai confuzive ale siste-

mului C++,dar ofera mijloace de exprimare exceptionale pentru operatiile

cu si asupra memoriei.Din acest motiv,trecerea de la C++ la alte limbaje

de programare se face mult mai greu decat de la C si Pascal la C++.


-8-

ELEMENTELE LIMBAJULUI C++

Elementele lexicale se utilizeaza pentru a forma declaratii,definitii,

instructiuni si comenzi etc.Principalele elemente care au semnificatie

pentru compilator sunt: token,comentariu,identificator,cuvant cheie,semn

de punctuatie,operator si constante.

Prin token se intelege cel mai mic element din program cu semnificatie

pentru compilator.Asadar,semnificatia unui anumit grup de caractere ASCII

poate fi diferita in functie de compilatorul utilizat.Pentru identificarea

fiecarui token,compilatorul include un program de analiza care separa

elementele unui program sursa in tokeni,prin comparare cu o lista sau un

tabel de elemente disticte,considerate a fi semnificative.De obicei,ele-

mentele sunt separate prin spatii goale,unice sau multiple si prin carac-

tere speciale de tip "new line","formfeed",tab-uri sau comentarii.Ca re-

zultat,se obtin elemente izolate,care pot fi:cuvinte cheie,identificatori

si semne de punctuatie,operatori etc.

In limbajul C++,doi tokeni pot fi grupati daca se utilizeaza grupul de

caractere ##.In acest caz,compilatorul va alipi cei doi tokeni si va in-

terpreta grupul de caractere rezultat ca pe un singur token.De la un

compilator la altul,interpretarea poate fi diferita,dar daca se respecta

cu strictete standardul de limbaj,toate compilatoarele vor produce rezul-

tate similare.Intelegerea acestor notiuni este importanta doar atunci cand

se utilizeaza programe de analiza sau de conversie a datelor de la un

sistem de operare la altul.

Comentariile sunt adnotatii de tip text,introduse in fila de cod,cu

intentia de a explica notiunile implementate.Compilatorul trateaza un

comentariu ca si cand ar fi un spatiu gol simplu(are doar rol de separator

intre tokeni),astfel incat comentariile nu influenteaza cu nimic executia

programului (dar consuma din memoria de operare). Un comentariu trebuie

introdus intre grupul de caractere /* si respectiv */ sau poate sa urmeze

dupa grupul de caractere //.

Exemple: /* Este un comentariu */

// Este tot un comantariu (pana ca capatul randului)

Dupa // tot ce urmeaza pana la capatul randului,va fi considerat de catre

compilator a fi un comentariu (si nu va fi executat).

Este bine sa explicati formulele savante si procedeele tehnice inovatoare,

atunci cand sunt greu de intuit la prima vedere,sau contin elemente rar

utilizate in programare.Comentariul trebuie sa contina datele utile pentru

depanare.Nu utilizati comentariile pentru literatura,sau aberatii savante.

Identificatorul este un grup de caractere prin care se declara in pro-

gram introducerea unui element de tip obiect sau variabila,a unei functii

sau a unei proceduri,a unei etichete,sau a unui tip de data,etc.

Pentru identificatori se pot utiliza caracterele alfanumerice si liniuta

de subliniere _.In versiunea Microsoft,un identificator poate avea maxim

247 de caractere (se recomanda sa utilizati mai putine).In C++ se tine

cont daca o litera este scrisa cu majuscula sau cu minuscula.

EXEMPLU: fileName este diferit de FileName

Identificatorii nu pot coincide cu cuvintele cheie,dar pot sa contina si

un cuvant cheie inclus intre alte caractere.Identificatorii care incep cu

doua liniute (__)sau o liniuta si o majuscula (_A,_B...etc) se utilizeaza

de obicei pentru a desemna constante si variabile predefinite in diversele

unitati.Evitati formarea de astfel de identificatori banali.


-9-

Cuvintele cheie sunt identificatori rezervati pentru o anumita semni-

ficatie precisa si nu pot fi utilizati in program cu un alt sens (nu pot

fi redefiniti).Cuvintele cheie C++ (inclusiv Visual C++) sunt:

asm,auto,bad_cast,bad_typed,bool,break,case,catch,char,class,const,

const_cast,continue,default,delete,do,double,dynamic_cast,else,enum,except

explicit,extern,false,finally,float,for,friend,goto,if,inline,int,long,

mutable,namespace,new,operator,private,protected,public,register,return,

reinterpret_cast,short,signed,sizeof,static,static_cast,struct,switch,

template,this,throw,true,try,type_info,typedef,typeid,typename,union,

unsigned,using,virtual,void,volatile,while

In versiunea Microsoft C++ se adauga si urmatorele cuvinte cheie:

allocate,__asm,__based,__cdcl,__declspec,dllexport,dllimport,__except,

__fastcall,__finally,__inline,__int8,__int16,__int32,__int64,__leave,

__multiple_inheritance,naked,nothrow,property,selectany,__stdcall,

__single_inheritance,thread,__try,uuid,__uuidof,__virtual_inheritane

Pentru semnificatia fiecaruia dintre ele consultati manualul Help.Nu

utilizati aceste cuvinte pe post de identificatori banali,chiar daca

in versiunea d-voastra nu sunt incluse sub forma de cuvinte cheie,deoarece

poate ca in viitor ve-ti upgrada la o versiune mai noua si doriti sa

pastrati compatibilitatea programelor realizate.

Semenele de punctuatie sunt:

! % ^ & * ( ) - + = { } | ~ [ ] \ ;

' : " < > ? , . / #

Punctuatorii (semnele de punctuatie),considerati izolat,nu au semnificatie

de operatori,dar au semnificatie pentru compilator (tokeni).

Pentru a primi semnificatie de operator trebuie sa fie utilizati intr-un

anumit context,impreuna cu un anumit tip de data,sau intr-o anumita

formula fixa de grupare a lor.

Operatorii sunt caractere sau grupri de caractere care determina executia

unei anumite operatii.

Principalii operatori (in ordinea precedentei sunt):

:: (scope resolution), :: (global), [] (array subscript), () (function

call), () (conversion), . (member selection), ->(member selection pointer)

++ (postfix increment), -- (postfix decrement), new (allocate object),

delete (deallocate object), delete[] (deallocate object), ++ (prefix in-

crement), -- (prefix decrement), * (dereference), & (address-of), + (plus)

- (arithmetic negation), ! (logical NOT), ~(bitwise complement), sizeof

(size of object), sizeof() (size of type), typeid() (type name), type

(type cast), const_cast (type cast), dynamic_cast (type cast),

reinterpret_cast (type cast), static_cast (type_cast), .* (apply pointer

to class member), ->* (dereferance pointer to class member), * (multipli-

cation), / (division), % (remainder-modulus), + (addition), - (substrac-

tion), << (left shift), >> (right shift), < (less than), > (greater than),

<= (less than or equal to), >= (greater than or equal to), == (equality),

!= (Inequality), & (Bitwise AND), ^ (Bitwise exclusive OR), | (Bitwise OR)

&& (logical AND), || (Logical OR), e1?e2:e3 (conditional), = (assigment),

*= (multiplication assigment), /= (division assigment), %= (modulus assig-

ment), += (addition assigment), -= (substraction assigment), <<= (left

shift assigment), >>= (right shift assigment), &= (Bitwise AND assigment),

|= (Bitwise inclusive OR assigment), ^= (Bitwise exclusive OR assigment)

, (comma).


-10-

In functie de numarul membrilor din ecuatie operatorii pot fi unari,

binari sau tertiari.Operatorii se asociaza fie cu expresia de la stanga

lor,fie cu expresia situata de la dreapta lor,fie cu nici una.In lista

prezentata,operatorii sunt ordonati de la cel cu precedenta cea mai mare

spre cel cu precedenta cea mai mica.Ultimii din lista,incepand cu cel

conditional (e1?e2:e3) se asociaza de la dreapta la stanga iar ceilalti

se asociaza de la stanga la dreapta (sau deloc).

In situatiile in care intr-o expresie sunt mai multi operatori cu

precedenta egala (de acelasi fel),vor fi interpretati in ordinea in care

apar in expresie,de la stanga la dreapta (daca nu exista si paranteze

care sa forteze o alta ordine de evaluare).

In general,este bina sa utilizati expresii cat mai scurte,si cat mai

clare,pentru a evita orice ambiguitate sau confuzie.Expresiile complicate

si alambicate sunt apanajul incepatorilor.

Este bine sa nu utilizati pointeri in formularea expresiilor matematice

decat daca este imperios necesar.Este preferabil sa preluati valorile de

la adresele de memorie inainte de a intra in expresia de calcul.Astfel

puteti evita evantualele "erori de precedenta".Nu uitati ca in versiuni

diferite ale programului compilatorul va utiliza tabele diferite de com-

paratie pentru identificarea elementelor de tip token.Cu formule de calcul

prea savante,riscati sa obtineti rezultate absolut imprevizibile.

Constantele (literals) sunt elemente de program invariabile.Constantele

pot fi de patru tipuri fundamentale: integer,character,floating-point si

string(intregi,caractere,numere in virgula mobila sau siruri de caractere)

Elementele prezentate formeaza limbajul C++,asa cum cuvintele din

dictionar formeaza vocabularul unei anumite limbi.Cu aceste elemente se

pot forma expresii,structuri de date,file si module de program,etc.
CONCEPTE DE STRUCTURARE A LIMBAJULUI
Limbajul C++ este o continuare a limbajului C.Toate regulile din C se

aplica si in C++.In plus,pentru structurile necesare programarii orientate

spre obiecte,C++ a introdus si o terminologie specifica.Pentru a simplifi-

ca explicatiile,principalii termeni utilizati vor fi prezentati pe scurt:

DECALRATION (declaratia) -este procedeul prin care se introduc in program

elemente noi.De cele mai multe ori declaratia coincide cu definitia

si caracterizeaza elementul introdus,dar nu este obligatoriu.In cazul

tipurilor de date abstracte,elementele sunt doar declarate,urmand sa

fie definite ulterior.

DEFINITION (definitia) - este procedeul prin care se specifica toate date-

le necesare prin care se caracterizeaza un anumit element de program

(variabila,functie,clasa,obiect etc).In urma definitiei compilatorul

aloca memoria necesara si genereaza codul necesar,astfel incat ele-

mentele respective devin din abstracte (sau virtuale) elemente reale.

LIFETIME (existenta) - este perioada de timp in care elementul respectiv

exista in program (intre creerea si eliberarea lui).

LINKAGE (legaturi) - specifica legaturile care exista intre elementele

unui program.Legaturile pot fi in cadrul aceluiasi modul (internal

linkage) sau intre elemente situate in module diferite (external

linkage).Uneori,elementele unui modul de program sunt definite in alt

modul de program,sau apeleaza la elemente definite in alt modul.


-11-

NAME (nume,element) - identifica un obiect,o functie,o valoare sau orice

alt element din program.Poate fi un identificator sau un tip de data.

OBJECT - este un tip de data structural in care se pot grupa atat date

din tipuri diferite,sub forma de membri cat si functii si proceduri,

sub forma de metode.Un obiect este o instanta a unei clase.

CLASS (clasa) - este definitia abstracta a unui tip de obiect.Contine

declaratia si definitia obiectului.Prin atribuirea de valori concrete

se formeaza un obiect real (o instanta a clasei respective).Obiectele

care provin din aceeasi clasa pot avea valori diferite (sunt instante

diferite ale aceluiasi tip de data.

SCOPE (vizibilitate) - descrie modulul sau fragmentul de program in care

o anumita data este interpretata cu valoarea declarata.Astfel,datele

declarate global sunt vizibile in tot programul,iar cele locale sunt

vizibile doar in cadrul functiei respective.Pentru obiecte exista

specificatorii de acces: "private","public" si "protected".

VIRTUAL FUNCTIONS -functiile virtuale sunt functii pentru care definitia

exacta urmeaza sa fie specificata la un alt moment dat.Acest gen de

functii sunt declarate in clasele abstracte,pentru a permite definirea

si redefinirea lor in obiectele derivate.
Ca o noutate absoluta a limbajului C++,fata de limbajul C apar notiunile

de clase si obiecte,si conceptul functiilor virtuale.

Obiectele sunt date de tip struct,in care se pot introduce si functii

sau proceduri cu vizibilitate locala.Astfel,se realizeaza un mic modul

de program,care poate functiona ca un mic program independent.In sistemele

cu multiprocesare paralela,mai multe obiecte pot opera simultan,in paralel

ca si cand ar fi programe care se deruleaza simultan.Se pot realiza un

numar practic infinit de astfel de obiecte,cu utilitate mai mica sau mai

mare,in functie de modul in care au fost implementate.Obiectele se pot

grupa in biblioteci de obiecte si pot simplifica substantial munca pro-

gramatorilor.In biblioteci,obiectele sunt arhivate sub forma unui sablon

al obiectului denumit clasa.Clasa contine toate definitiile necesare

pentru realizarea unui obiect,dar nu este un obiect real ci doar un obiect

virtual.Pentru a deveni obiect real,trebuiesc initializate cu valori toate

tipurile de date din interiorul obiectului (in caz contrar se obtin struc-

turi de date nule,care returneaza un mesaj de eroare).Pentru realizarea

operatiilor de initializare,exista de obicei o functie specializata,denu-

mita constructor.Pentru initializarea unui obiect este suficient sa fie

apelat "constructorul" obiectului respectiv.In mod similar,obiectele au

si o functie specializata denumita "destructor",care face toate operatiile

necesare pentru eliberarea memoriei (sterge obiectul din program).

Astfel,cu o simpla comanda,obiectul se construieste singur,sau se dis-

truge singur,in momentul indicat.Prin acest mecanism simplu,programul

poate sa apeleze si sa elibereze un numar mare de obiecte cu un consum

minim de memorie de operare.Ca rezultat,viteza de executie creste foarte

mult iar memoria de operare ramane libera pentru alte operatii.Prin me-

toda clasica,ar fi trebuit ca toate obiectele utilizate sa existe real

in memoria de operare (cu un consum foarte mare de memorie).Prin acest

procedeu tehnic,obiectele sunt arhivate in biblioteci si se materializeaza

(devin o instanta a obiectului) dar in momentul in care sunt necesare in

program,dupa care sunt eliberate pentru a face loc altor obiecte.


-12-

Mai mult decat atat,clasele de obiecte pot fi clase abstracte.In acest

caz,functiile obiectului sunt doar declarate,dar nu saut definite.Defi-

nitia acestor functii se va face in etapa de implementare in functie de

necesitatile de moment.Ca rezultat,se pot obtine instante extrem de

Yüklə 1,36 Mb.

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




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