səhifə 9/55 tarix 07.05.2018 ölçüsü 4,6 Mb. #50260
} screen[25][80];
Este un tablou ce contine 2000 de elemente.Fiecare element este o struc-
tura ce contine cate patru membri;icon,color,underline si blink,dintre
care icon se va reprezenta pe 8 biti,color pe patru,undrline si blink pe
cate unul.Cei patru membri ocupa impreuna 14 biti ,iar fiecare element va
fi reprezentat pe cate 16 biti,dupa cum urmeaza:
imagine.icon=9; //initializeaza icon
imagine.color=5; //initializeaza color
imagine.underline=3; //initializeaza underline
imagine.blink=4; //initializeaza blink
ADRESA HEXAZECIMALA(in binar) 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0
valoarea arhivata 0 0 4 3 5 5 5 5 9 9 9 9 9 9 9 9
-58-
Asadar,fiecare linie de adresa HEX va putea stoca un element al tabloului,
format din cate patru campuri distincte de biti,in ordinea specificata
prin declaratie.
Nu se pot declara pointeri orientati spre campurile de biti si nici
nu se pot declara functii care sa returneze campurile de biti.Campurile
de biti nu se pot declara decat ca parte componenta a unei structuri.
Operatorul de adresare (&) nu poate fi aplicat campurilor de biti.
Principala utilizare este pentru descrierea imaginilor grafice pixel
cu pixel(alb-negru sau color) prin desemnarea fiecarui pixel printr-un
camp de biti cu mai multe variante posibile(nuante).
Campurile de biti vor fi tratate ca si valori de tip int si vor fi
alocate in memorie incepand cu bitul cel mai nesemnificativ,spre bitul
cel mai semnificativ(de la ultimul bit din adresa spre primul din linie).
Exista si compilatoare ce permit utilizarea tipurilor de date char si
long,dar pentru acestea memoria de suport a informatiei trebuie sa fie
formatata pe 64-128 de biti(minimum 80 pentru datele de tip long)pentru
a putea cuprinde campurile de biti declarate.
Campurile de biti pot fi adresate la fel ca orice membru al unei
structuri,pentru a primi valori.Campurile de biti nedenumite,nu pot fi
accesate prin numele lor iar comportamentul lor in timpul executarii
programului poate fi impredicitibil.Sunt denumite campuri "dummy" (adica
proaste) si sunt utilizate uneori pentru alinierea datelor (imaginilor).
Campurile de biti nedenumite cu largime de zero biti determina ca urma-
torul camp de biti sa inceapa de la o valoare de tip int(intreg).
Campurile de biti au aceeasi semantica ca si datele de tip int,adica
vor putea fi utilizate in expresii la fel ca si variabilele de tip int ,
indiferent de numarul de biti din campul de biti(mai mult de un octet).
ENUMERARI
Sunt un tip structurat de date,definit de catre utilizator,care consta
dintr-un set de nume de constante (enumeratori).Implicit,primul enumerator
are valoarea 0 iar urmatorii au o valoare progresiv tot mai mare,cu excep-
tia situatiilor in care precizati explicit valoarea fiecarui enumerator.
Nu este necesar sa aiba valori unice.Numele ficarui enumerator este tratat
ca si o constanta si este suficient sa fie unic in cadrul structurii in
care a fost declarat(se poate repeta in alte enumerari).Valoarea unui
enumerator poate fi transferata unei valori de tip int.Declaratia se face
cu ajutorul cuvantului cheie enum,dupa sintaxa generala:
enum[tag]{lista enumaratori}[declarator];
In limbajul C++,enumerarile declarate in cadrul unei clase sunt acce-
sibile doar pentru membrii clasei respective.
EXEMPLU: enum ZileSaptamana {
sambata, //implicit are valoarea 0
dumineca=0, //va avea valoarea 0
luni, //va avea valoarea 1
marti, //va avea valoarea 2
miercuri, //va avea valoarea 3
joi, //va avea valoarea 4
vineri, //va avea valoarea 5
} astazi;
-59-
Toate elementele unei enumerari vor fi tratate ca si elemente de tip int.
Valoarea fiecarui element poate fi initializata la declarare,dar nu poate
fi schimbata ulterior(elementele sunt constante).Se utilizeaza pentru
a desemna titluri,etichete,capete de coloana in tabele etc.Pot fi utili-
zate si ca elemente de filtrare a datelor (comparare cu un element con-
stant) sau de validare a unei parole etc.Numarul maxim de identificatori
ce poate fi cuprins intr-o enumerare este de 65535.
In cazul in care doriti sa transmiteti o enumerare in format de 32 de
biti,se va adauga si atributul "v1 enum".Alte atribute acceptate pentru
enumerari sunt:helpstring,helpcontext,hidden si uuid.
TYPEDEF
Este cuvantul cheie utilizat pentru redenumirea tipurilor de date.Se
utilizeaza pentru a desemna un nume nou unui anumit tip de date.Declaratia
va fi interpretata la fel ca si cea pentru o variabila sau o functie.
Sintaxa generala este: typedef specificator de tip identificator
EXEMPLU: typedef int INTREG //tipul de date int va fi redenumit ca INTREG
In continuare,numele nou definit se va putea utiliza pentru a specifica
tipul datelor in declaratiile ulterioare:
INTREG numar //declara o variabila de tip int
Redenumirea se poate aplica si unei variabile sau arii de date ,unui
pointer,unei structuri sau uniuni,sau oricarui tip de date.
EXEMPLU: typedef struct club
{
char name[30];
int size,year;
} GROUP;
declara structura GROUP,formata din trei membri care va putea fi utilizata
in declaratii si cu numele de club(cel declarat prin typedef).
Acest gen de declaratii limiteaza portabilitatea generala a datelor,dar
poate asigura portabilitatea in cazul in care datele din alta fila a pro-
gramului au fost denumite in acelasi mod.Uneori se utilizeaza pur si
simplu pentru a scurta si simplifica denumirile prea lungi sau complexe.
Nu se poate utiliza acelasi nume pentru a cumula diferite tipuri de
date(genereaza eroare),dar se poate repeta aceeasi declaratie cu conditia
sa se refere la acelasi tip de date(se poate redeclara).
Dupa redenumire,compilatorul nu asigura compatibiliatatea datelor cu
cele de acelasi tip din alte file ale programului,deoarece numele decla-
rate prin typedef nu au legatura (linkage) cu cele de acelasi tip dar
definite diferit in alte programe.Datele vor putea fi translatate doar
daca utilizati aceeasi conventie de redenumire in toate filele programului
Typedef are calitatea de a va permite sa va personalizati programele.
LISTE
Sunt structuri de date de acelasi fel,legate intre ele pritr-o anumita
ordine.Listele sunt structuri dinamice si pot fi modificate in orice mo-
ment prin adaugarea sau eliminarea de elemente.Relatiile de ordine dintr-o
lista se pot realiza prin pointeri spre tipul respectiv de date(si ope-
ratii cu pointerii respectivi).
-60-
Listele sunt similare cu ariile unidimensionale,dar modul de arhivare
este diferit.Fiecare element din lista contine si un pointer catre ele-
mentul anterior si respectiv catre cel urmator(lista dublu inlantuita)
care permite ca elementele din lista sa poata fi parcurse de la un capat
la altul.Daca lista nu poate fi parcursa decat intr-un singur sens(fiecare
element contine si un pointer catre elementul urmator),atunci lista se
numeste simplu inlantuita.Lisa are doua capete,cu un element denumit cap
de lista si un element terminal.Atunci cand exista cate un pointer si
spre capatele listei,lista poate fi parcursa continuu si se numeste lista
circulara simplu sau dublu inlantuita.Se utilizeaza foarte frecvent in
casete de dialog pentru alegerea unei optiuni,a unui fisier,obiect etc.
Prezinta avantajul ca elementele pot fi adaugate sau eliminate dupa cum
este necesar(impreuna cu cei doi pointeri de inlantuire).
Un caz particular al listei simplu inlantuite este stiva.Stiva are
doua capete,baza stivei si varful stivei si gestioneaza memoria dupa
regula LIFO(Last IN First Out).
Exista functii special destinate pentru crearea si gestionarea listelor
ce vor fi discutate impreuna cu bibliotecile de functii optionale.
In mod similar,tot cu ajutorul unor functii special destinate se pot
crea si utiliza blocuri dinamice de date (functia malloc) sau fisiere(
functiile fopen,fget,fputc etc),structuri ce vor fi prezentate in cadrul
fiecarei biblioteci specializate.
CLASE DE OBIECTE
Au fost introduse pentru a facilita crearea de obiecte in limbaj C++,
compatibile cu interfata API din Windows.Au acceasi mod de definitie ca
si structurile si uniunile care sunt considerate a fi tot tipuri de clase.
Variabilele si functiile unei clase poarta numele de membri.Membrii unei
clase sunt de obicei unul dintre urmatoarele tipuri:
-membri care definesc atributele unui obiect
-constructori,adica functii care initializeaza un obiect
-destructori,adica functii care sterg un obiect din memorie
-functii care definesc comportamentul unui obiect in diverse situatii
Sintaxa generala este:
class [tag[:lista de baza]]
{
membrii
...
}[declaratori];
[class]tag declaratori;
tag -este identificatorul(numele unic al clasei respective)
lista de baza- specifica din ce clasa deriva(care este clasa de baza) si
poate fi precedat de un specificator de acces(public,private,protected)
Membri pot include date,functii,alte clase sau structuri,enumerari,
campuri de biti,etc.Pot fi membri inclusiv pointerii orientati spre
propria clasa (autoreferire-vezi cuvantul cheie virtual).
Declaratorii denumesc unul sau mai multe obiecte din clasa descrisa.
Membrii unei clase pot fi declarati de tip "friend" in interiorul
altei clase,pentru a permite accesul facil la date.Accesul la membrii se
face prin operatorii .(punct) si -> la fel ca la structuri.
-61-
Atunci cand o functie care este membru al unei clase apeleaza un alt
membru al aceleiasi clase,operatorii . sau -> pot fi omisi din expresie.
EXEMPLU: class Point
{
public:
short x(){return_x;}
short y(){return_y;}
void Show(){cout<
private:
short _x,_y;
};
observati ca functia Show apeleaza la membrii x() si y() fara operatori
Identificatorul(numele) fiecarei clase trebuie sa fie unic.In aceeasi
fila de program nu se pot introduce doua definitii de clasa pentru acelasi
nume.Numele clasei poate fi declarat impreuna cu specificatorul de acces
(global sau scope).
Scope(aria de extindere) defineste intr-un program zona in care o
anumita denumire este "vizibila"(adica zona in care exista in memorie o
definitie activa pentru denumirea respectiva.Exista patru tipuri de scope:
-Local scope-caz in care un nume declarat in cadrul unui bloc de date
este accesibil strict in interiorul blocului respectiv.
EXEMPLU: { int i; }
-Function scope-desemneaza numele in interiorul unei functii si este
accesibil strict in interiorul functiei respective.
-File scope -numele este accesibil in orice loc al programului din fila
respectiva.Se mai numeste si global.
-Class scope- desemneaza membrii ai unei clase ce vor putea fi accesati
doar cu operatorul . sau -> sau prin intermediul unui pointer.
EXEMPLU: class Punct
{
int x;
int y;
};
membrii vor putea fi apelati prin Punct.x sau Punct.y
Clasele de obiecte "template" sunt clase de obiecte parametrizate.Prin
"Template" se inteleg tipuri de date care respecta niste parametri ficsi.
Se utilizeaza pentru a simplifica unele definitii(template actioneaza ca
si niste macrofunctii predefinite ,parametrizate-cu limite precizate).
Tipul clasei se declara prin specificatorii const sau volatile.
Accesul implicit la membrii unei clase este de tip privat (private).
Clasele pot fi si anonime,daca se declara fara identificator.Se pot utili-
za impreuna cu typedef,pentru a redenumi o clasa.
EXEMPLU : typedef struct
{
unsigned x;
unsigned y;
} POINT;
Clasele anonime nu pot avea constructori sau destructori,nu pot fi utili-
zate ca argument al unor functii si nu pot fi returnate ca rezultat al
evaluarii unor functii.
Accesul la membrii unei clase poate fi controlat prin specificatori.
-62-
Specificatorii de acces sunt:
-private(implicit)=acces numai pentru membrii clasei si "friends"
-protected=acces pentru membrii clasei,"friends" si clasele derivate
-public=acces pentru orice functie din program
Clasele pot fi intricate,una in alta,caz in care cea din interior va fi
membru al celeilalte.Pentru referirea unei astfel de clase,declaratia
trebuie sa specifice explicit calea de acces.In mod obisnuit nu se
acceseaza din afara clasei.
Declararea unei clase ca fiind de tip "friend" permite accesul la membri
sai.EXEMPLU: class B;
class A
{
int Func1(B&b);
int Func2(B&b);
};
class B
{
private:
int _b;
friend int A::Func1(B&b) //permite accesul pt Func1
};
in exemplu,clasa B este cu acces privat,dar functia Func1() din clasa A a
fost declarata "friend" si va putea accesa valorile din clasa B (_b).
O clasa de baza este acea clasa care este utilizata pentru a forma clase
derivate(care vor utiliza definitia clasei de baza).
Clasele derivate preiau toti membrii clasei de baza,la care mai adauga si
membri noi,pentru a forma o noua clasa.Atunci cand procesul se repeta de
mai multe ori ,fiecare clasa derivata mostenind o parte din membri de la
clasele precedente,se poate construi un arbore genealogic al claselor
definite,pentru a observa mai usor tipul de "mostenire".
Clasele abstracte sunt acele clase care contin cel putin o functie
virtuala.Dintr-o clasa abstracta pot deriva mai multe tipuri specifice de
clase.Pot fi referite prin pointeri dar nu pot crea obiecte.Clasele
derivate din cea abstracta,trebuie sa implementeze functia virtuala,sau
in caz contrar vor fi si ele abstracte.Clasele abstracte nu pot fi uti-
lizate pentru date si variabile,argumente,functii sau conversii de date.
EXEMPLU: class ContCurent
{
public:
Cont( double d);
virtual double BalantaPlati();
virtual double Dobanda()=0;
};
O clasa derivata poate avea mai multe clase de baza,caz in care se
spune ca are o mostenire multipla.Pentru acest scop,clasele de baza vor
fi introduse sub forma de lista.
EXEMPLU: class Colectie : public Carti,public Biblioteca
va contine membrii din ambele clase de baza cumulati,si eventual si alti
membri noi,declarati intre acolade.Ordinea in care se specifica clasele
de baza nu este semnificativa decat daca se invoca functii speciale de
tip constructor sau destructor care schimba arhitectura clasei.
-63-
Regulile de baza,privitoare la modul de acces la membrii unei clase
(vizibilitatea-scope) sunt:
-ambiguitatea-adica numele claselor trebuie sa fie distincte in
cadrul aceluiasi "spatiu de vizibiliate" (sa nu fie ambigue)
-globalitatea-un obiect,o functie sau un enumarator este global daca
a fost definit in afara oricarei functii sau clase,sau daca este definit
cu specificatorul "global" si daca nu este in conjunctie cu nici unul
dintre operatorii :: sau . sau -> (de rezolutie sau de membru).
-precedenta numelor -in functie de operatorii utilizati sau de pozitia
in care au fost definite,numele obiectelor vor fi cautate in urmatoarea
ordine: 1.in spatiul de vizibilitate curent(blocul de date actual)
2.in spatiul de vizibilitate imediat exterior celui curent si
apoi in toate blocurile de date din spatiul respectiv (Exemplu: in inte-
riorul unei functii,apoi in clasa in care a fost declarata functia).
3.daca numele a fost declarat in cadrul unei clase,se va cauta
in continuare in toata zona de vizibilitate a clasei respective(inclusiv
in functiile si membrii declarati "friend" pentru clasa respectiva).
4.in continuare se va cauta in clasa de baza a clasei respective
5.apoi se va cauta in clasele intricate,incluse in clasa respec-
tiva(daca exista clase intricate)
6.in continuare se va cauta in spatiul global(cel din afara
obiectelor declarate)
In esenta,cautarea se va face din interiorul obiectelor decla-
rate spre exterior.Ordinea de cautare poate fi modificata prin:
7.operatorul :: forteaza cautarea la nivel global
8.cuvintele cheie class,struct,union forteaza cautarea in obiec-
tele desemnate
9.obiectele situate la stanga operatorului :: nu pot fi decat
nume de clase,structuri sau uniuni.
-argumentele functiilor-sunt in zona de vizibilitate a functiei res-
pective in timp ca numele functiilor sunt in spatiul de vizibilitate
imediat exterior
-functiile constructor sunt evaluate pentru cel mai exterior dintre
spatiile de vizibilitate in care actioneaza functia respectiva(atunci
cand functia este complexa si actioneaza la nivele diferite ale progra-
mului.
Clasele pot fi declarate si "goale",adica fara nici un membru.
EXEMPLU: class Faramembri
{
};
Chiar daca nu contine date,aceasta clasa ocupa spatiu in memorie si
poate fi adresata prin pointeri.Se utilizeaza uneori pentru a rezerva loc
in program,pentru o clasa ai carei membri vor fi definiti ulterior.
Daca o clasa de baza este "goala",atunci clasele derivate din ea vor
mosteni zero biti iar memoria ocupata nu va fi cu nimic mai mare,dar clasa
derivata isi va pastra pozitia ierarhica,fata de cea de baza,in arborele
genealogic.
Daca o clasa contine date exportabile,atunci si clasa de baza trebuie
sa fie de acelasi tip (exportabila),in caz contrar se genereaza eroare.
O clasa "friend" este o clasa in care toti membrii sunt de tip "friend"
adica au accesul garantat si la functiile "private" si "protected".
-64-
Functiile declarate "friend" in interiorul unor clase intricate in alte
clase,nu vor avea domeniul de vizibilitate(si implicit de acces) decat in
interiorul clasei intricate.Pentru acces global,trebuie declarate global.
Clasele de obiecte pot avea si acces multiplu,adica un anumit obiect din
clasa poate fi accesat pe mai multe cai,utilizand diverse parti componente
ale obiectului respectiv.
Clasele parametrizate sunt denumite "Template".Unele programe(VisualC++)
ofera o gama foarte variata de clase template predefinite,usor de inclus
in programe,cu ierarhia gata prestabilita si respectand toate regulile de
sintaxa.
Clasele pot fi si redefinite (redenumite) utilizand typedef,la fel ca
si in cazul structurilor,dar in acest caz utilizarea claselor standard ale
programului(cele incluse in Microsoft Foundation Class) poate fi soldata
cu erori de interpretare.Este preferabil sa utilizati aceasta optiune
doar in programele care contin doar clase definite de d-voastra,sau
respectiv sa grupati toate obiectele redenumite intr-un fisier separat
(pentru a facilita decriptarea si respectiv depanarea programului).
Pentru ca o clasa intrega sa fie exportabila,sau importabila,declararea
se va face cu dllimport sau dllexport.
Dostları ilə paylaş: