Limbajul c si C++ abc-doar



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

} 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.

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   5   6   7   8   9   10   11   12   ...   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