http://alpha-thema-online.uv.ro
Fa-ti si tu propriul forum, pe www.myforum.ro!
Pagina de start a forumului http://alpha-thema-online.uv.ro Autentificare Inregistrare FAQ Membri Cautare

Pagina de start a forumului http://alpha-thema-online.uv.ro » C / C++ / C# » [C++]Manual C++ part. 1
Creaza un subiect nou  Raspunde la subiect Subiectul anterior :: Subiectul urmator 
[C++]Manual C++ part. 1
MesajTrimis: 24/08/2007 13:42 Raspunde cu citat (quote)
Ad_Infinitum
Administrator
Administrator
Ad_Infinitum
Data inscrierii: 23/Iun/2007
Mesaje: 212




Concepte de bazã ale limbajului C++






Modalitãþile (tehnici, paradigme) de programare au evoluat de-a lungul anilor, reflectând trecerea de la programe de mărimi reduse la programe ºi aplicaþii de dimensiuni cumplit de mari, pentru coordonarea cãrora sunt necesare tehnici evoluate.
Software-ul de dimensiuni mari, care nu poate fi conceput de o singurã persoanã, intrã în categoria sistemelor complexe, alãturi de alte sisteme complexe din cele mai variate domenii, cum sunt organizarea materiei sau organizãrile sociale.
Situaþiile naturale ºi experienþe ale psihologilor au relevat limitele capacitãþii umane în percepþia sistemelor complexe, adicã imposibilitatea unei persoane de percepe ºi controla un numãr mare de entitãþi de informaþie simultan. De aceea, descompunerea ºi organizarea sistemelor complexe, în scopul de putea fi percepute, proiectate sau conduse este esenþialã. Ordinea în sistemele complexe este introdusã în general printr-o organizare ierarhicã, pe mai multe soiuri ºi nivele de ierarhie. În reprezentarea ierarhicã a sistemelor complexe se evidenþiazã douã tipuri de ierarhii: ierarhia structuralã sau de compoziþie ºi ierarhia de tip.
Ierarhia structuralã este o ierarhie în care se poate afirma despre un obiect cã este o parte a altui obiect, mai complex. Exemple de astfel de descompuneri se pot da oricâte, din absolut orice domeniu. De exemplu, un calculator poate fi studiat prin descompunerea lui în subansamble componente: placa de bazã, placa video, monitor, etc; la rândul ei, placa de bazã este compusã din placheta de circuit imprimat, procesor, memorie, etc. Aceasta este o ierarhie de tipul “este o parte din…”.
Pe de altã parte, fiecare obiect poate fi încadrat într-o categorie (clasã, tip) mai largã, care conþine mai multe obiecte care au proprietãþi comune. De exemplu, procesorul este de o componentã electronicã; monitorul este un dispozitiv de afiºare, etc. Aceastã ierarhie se referã la apartenenþa obiectelor la o anumitã clasã (sau tip - “este de tipul…”).
Este esenþial de a privi sistemele complexe din ambele perspective, studiindu-le atât din perspectiva ierarhiei structurale, deci a obiectelor care le compun, cât ºi a ierarhiei de tip, deci a claselor cãrora le aparþin. La rândul lor, clasele din care fac parte obiectele pot fi organizate sau studiate ca elemente componente ale unei ierarhii, prin care o clasã este consideratã ca primitivã (pãrinte) a unei alte clase. Cele douã tipuri de ierarhii, ierarhia de clase ºi ierarhia de obiecte nu sunt independente, ºi, împreunã, pot sã reprezinte un sistem complex.
La fel ca oricare sistem complex, software-ul poate fi monitorizat prin descompunerea lui. Rolul descompunerii unui sistem în general (ºi al programelor în special) este de a permite înþelegerea ºi manevrarea acestuia: sistemul este descompus în pãrþi din ce în ce mai mici, fiecare dintre ele putând fi rafinatã ºi dezvoltatã independent. Principiul “divide-et-impera”, care se aplicã în numeroase situaþii, este util ºi în programare.

Se pot identifica douã tipuri de descompunere a programelor: descompunerea algoritmicã ºi descompunerea orientatã pe obiecte.
Descompunerea algoritmicã îngăduie abordarea structuratã a programãrii. Programul este împãrþit în module, în funcþie de acþiunile pe care trebuie sã le efectueze, fiecare modul se împarte în elemente funcþionale (blocuri, proceduri, funcþii), într-o structurare de sus în jos (top-down), care urmãreºte diagrma de trecere a datelor în cursul execuþiei.
Descompunerea orientatã pe obiecte este o alternativã de descompunere prin care programul se descompune dupã obiectele care pot fi identificate, fiecare obiect având asociate o mulþime de operaþii care sunt apelate în cursul desfãºurãrii programului.
O problemã nu poate fi abordatã simultan prin ambele metode; se alege fie una, fie cealaltã metodã. Care dintre ele este cea mai bunã? Nu existã un rãspuns perfect ºi universal valabil, dar experienþa a dovedit cã pentru sisteme de dimensiuni mari, descompunerea orientatã pe obiecte este mai eficientã, mai sigurã ºi mai flexibilã.


Tehnici de programare

Modul în care este abordatã programarea din punct de vedere al descompunerii programelor defineºte mai multe tehnici de programare (paradigme), care s-au dezvoltat ºi au evoluat odatã cu evoluþia sistemelor de calcul.

Programarea proceduralã este întâia modalitate de programare care a fost ºi este încã frecvent folositã. În programarea proceduralã accentul se pune pe descompunerea programului în proceduri (funcþii) care sunt apelate în ordinea de desfãºurare a algoritmului. Limbajele care suportã aceastã tehnicã de programare prevãd posibilitãþi de transfer a argumentelor cãtre funcþii ºi de returnare a valorilor rezultate. Limbajul Fortran a fost debutantul limbaj de programare proceduralã. Au urmat Algol60, Algol68, Pascal, iar C este unul din ultimile invenþii în acest domeniu.

Programarea modularã. În cursul evoluþiei programãrii procedurale accentul în proiectarea programelor s-a deplasat de la proiectarea procedurilor cãtre organizarea datelor, aceastã deplasare reflectând creºterea dimensiunilor programelor. O mulþime de proceduri corelate, împreunã cu datele pe care le manevreazã sunt organizate ca un modul. Tehnica de programare modularã decide descompunerea unui program în module, care încorporeazã o parte din datele programului ºi funcþiile care le manevreazã. Aceastã tehnicã este cunoscutã ca tehnicã de ascundere a datelor (data-hiding). În programarea modularã stilul de programare este în continuare procedural ºi nu existã o asociere strictã între date ºi procedurile care opereazã asupra acestora, ci doar gruparea în module cu probabilitatea de a ascunde anumite informaþii (date, nume de variabile, funcþii) definite într-un modul, faþã de celelate module.
Modularitatea ºi ascunderea informaþiilor sunt caracteristici implicite în programarea orientatã pe obiecte.

Programarea orientatã pe obiecte reprezintã încorporarea în domeniul programãrii a unei metode larg rãspândite în tehnicã, numitã tehnologia orientatã pe obiecte, care se bazeazã pe prototipul obiect. Modelul obiect al unei aplicaþii implicã patru principii importante ºi anume:
abstractizare;
încapsularea;
modularitate;
ierarhie (moºtenire).
În afara acestor principii, tiparul obiect mai presupune: tipizare, concurenþã ºi persistenþã. Aproximativ nici unul dintre aceste principii nu este nou, dar utilizarea lor împreunã în modelul obiect, are un rol sinergetic, de potenþare reciprocã.
Primele aplicaþii ale acestor principii au fost introduse în limbajul Simula, care a stat la baza dezvoltãrii ulterioare ºi a altor limbaje care permit abordarea modelului obiect: Smaltalk, Object Pascal, C++, Clos, Ada, Eifel.
În momentul de faþã, exemplarul obiect se dovedeºte a fi un concept unificator în ºtiinþa calculatoarelor în general, fiind aplicabil nu numai în programare, ci ºi în arhitectura calculatoarelor, în proiecatarea interfeþelor utilizator, în baze de date.

Programarea orientatã pe obiecte-POO- (object-oriented programming) este o metodã de programare în care programele sunt organizate ca ºi colecþii de obiecte cooperante, fiecare dintre ele reprezentând o instanþã a unei clase oarecare, iar clasele sunt membre ale unei ierarhii de clase, corelate între ele prin relaþii de moºtenire.

Existã trei pãrþi importante ale acestei definiþii:
Se folosesc obiecte, nu algoritmi ca unitãþi constructive de bazã, obiectele fiind ingrediente ale unei ierarhii structurale.
Fiecare obiect este o instanþã (un exemplar) al unei clase.
Clasele sunt componente ale unei ierarhii de tip (“este de tipul…”), fiind corelate între ele prin relaþii de moºtenire.
Dacã lipseºte una din aceste caracteristici, programarea nu se mai numeºte orientatã pe obiecte, ci programare prin abstactizarea datelor, deoarece o clasã este un tip de date abstract (sau programare bazatã pe obiecte).
Un limbaj este considerat un limbaj de programare orientatã pe obiecte dacã satisface mai multe cerinþe, ca de exemplu:
Suportã obiecte (instanþe ale unor clase), clasele fiind tipuri definite de utilizator (numite ºi tipuri abstracte de date).
Tipurile (clasele) pot moºteni atribute de la alte clase, numite clase de bazã.
Dacã un limbaj nu suportã direct moºtenirea între clase se numeºte limbaj de programare bazat pe obiecte (object-based), cum este, de exemplu, limbajul Ada.
Principiile modelului obiect aplicate în programare, enunþate mai sus, vor fi prezentate pe simplu în continuare, detalierea lor fiind reluatã în cursul expunerii, dupã descrierea suportului oferit de limbajul C++ fiecãreia dintre acestea.
Abstractizarea înseamnã identificarea similitudinilor între distincte entitãþi, situaþii sau procese din mulțimea realã ºi decizia de a se concentra atenþia asupra acestor aspecte comune ºi ignorarea pentru început a celorlate aspecte. Abstractizarea denotã caracteristicile esenþiale ale unui obiect, care îl deosebeºte de toate celelalte feluri de obiecte.
Încapsularea este procesul de compartimentare a elementelor unei abstractizãri în douã pãrþi: structura ºi comportarea; încapsularea separã comportarea (accesatã prin interfaþã) de structurã, definitã prin implementare. Încapsularea prevede graniþe între diverse abstractizãri, ceea ce conduce la o separare clarã a acestora.
Modularizarea este procesul de partiþionare a unui program în componente individuale (module) ceea ce permite reducerea complexitãþii programului prin definirea unor graniþe bine stabilite ºi documentate în program. În practica programãrii, modularitzarea constã în partiþionarea programului în module care pot fi compilate separat, dar care au conexiuni cu alte module ale programului. Modulele servesc ca ºi containere în care sunt declarate clasele ºi obiectele programului.
Ierarhia este o modalitate de a ordona abstactizãrile (tipurile abstacte de date).
Ierarhiile denotã o relaþie de tip. De exemplu, un trandafir este o floare (“un tip” de floare), algoritmul quicksort este un algoritm de sortare, etc. Ierarhiile definesc relaþii între clase prin care o clasã (clasa derivatã) partajeazã structura sau comportarea definitã în altã clasã (clasa de bazã).
Tipizarea (typing). Tipul este o caracterizare precisã, structuralã ºi comportamentalã a unei colecþii de entitãþi. Deºi conceptul tipul este similar conceptului de clasã, tipizarea se referã la un element diferit al modelului obiect de cât cel la care se referã clasele. Tipizarea este o accentuare a clasei unui obiect, astfel încât obiecte de clase diferite nu pot fi intershimbate între ele sau, cel mult, pot fi interschimbate într-un mod foarte restrictiv. Din punct de vedere a tipizãrii, existã limbaje dominant tipizate (ca de exemplu, Eiffel), în care nu este admisã nici o operaþie asupra unui operand dacã aceasta nu a fost exact prevãzutã pentru obiectul respectiv. Alte limbaje, cum este Smalltalk, sunt limbaje netipizate, care admit la compilare indiferent ce fel de operaþii asupra operanzilor, eroarea violãrii de tip manifestându-se în timpul execuþiei. Limbajul C++ este hibrid. El are tendinþa de tipizare puternicã, dar este posibilã ignorarea sau inhibarea regulilor de tipizare. Deºi nu face parte din principiile fundamentale ale modelului obiect, tipizarea aduce beneficii importante în progrmarea obiect orientatã.
Concurenþa permite ca mai multe obiecte diferite sã fie în execuþie în acelaºi timp. Sistemele care implicã concurenþa sunt sisteme cu procesoare multiple, în care mai multe procese sau thread-uri (fire de execuþie) pot fi executate concurent pe procesoare diferite.
Persistenþa. Un obiect în software ocupã un anumit spaþiu în memorie ºi are o existenþã într-o perioadã determinatã de timp din timpul de execuþie al programului. De multe ori este necesar ca datele sã “supravieþuiascã” programului (exemplul tipic fiind bazele de date), iar definirea de cãtre fiecare programator a modului cum sunt salvate datele pentru a fi pãstrate dupã terminarea programului poate conduce c[tre scheme de memoare dintre cele mai diferite ºi greu de a fi utilizate interschimbabil. Prin conceptul de persistenþã se introduce un mod unitar de salcare ºi restaurare a datelor conþinute de obiecte ale programului.

Modelul obiect în domeniul programãrii implicã, pe lângã implementarea programului într-un limbaj anume, etape premergãtoare de analizã ºi proiectare care pregãtesc structurarea efectivã a programului.

Analiza orientatã pe obiecte este o metodã de analizã ºi examinare a unei aplicaþii din perspectiva claselor ºi a obiectelor din domeniul problemei respective.

Proiectarea orientatã pe obiecte este o metodã de proiectare a sistemelor care implicã descompunerea orientatã pe obiecte ºi asigurã o modalitate de reprezentare atât staticã cât ºi dinamicã a modelului sistemului proiectat.

Produsele unei analize orientate pe obiecte servesc ca modele ale proiectãrii orientate pe obiecte, iar rezultatele acesteia folosesc direct în programarea orientatã pe obiecte. Ca suport al modelului final, orientat pe obiecte al unei aplicaþii, programarea ºi limbajele orientate pe obiecte sunt acelea care se recomandã a fi studiate mai întâi, pentru a beneficia de toate facilitãþile ºi tehnicile puse la dispoziþie prioectanþilor, analiºtilor ºi programatorilor.

Dintre limbajele de programare orientate pe obiecte, limbajul C++ este unul dintre cele mai utilizate; compilatoare, biblioteci ºi instrumente de dezoltare a programelor C++ sunt disponibile atât pentru calculatoare personale cât ºi pentru cele mai dezvoltate sisteme ºi staþii de lucru.
Limbajul C++ este o versiune extinsã a limbajului C, extensiile acestuia fiind elaborate de cãtre Biarne Stroustrup în anul 1980 în laboratoarele Bell din Murray Hill, New Jersey. Extensiile dezvoltate de Stroustrup pentru limbajul C++ permit programarea orientatã pe obiecte, pãstrând eficienþa, flexibilitatea ºi concepþia de bazã a limbajului C. Numele iniþial a fost “C cu clase”, numele de C++ fiindu-i atribuit în anul 1983.
Scopul pentru care a fost făcut C++ este acelaºi cu scopul pentru care este abordatã în general programarea orientatã pe obiecte: creșterea ºi administrarea programelor foarte mari. Chiar dacã necesitatea ºi superioritatea limbajului C++ este evidentã în cazul dezvoltãrii programelor foarte mari, nu existã limitãri în a fi întrebuințat în orice fel de aplicaþii, datoritã faptului cã C++ este un limbaj tot atât de eficient ca ºi limbajul C.
De la apariþia sa, C++ a trecut prin trei revizii, în 1985, 1989 ºi ultima, prilejuitã de definirea standardului ANSI pentru acest limbaj. O primã versiune a standardului a fost publicatã în anul 1994, iar urmãtoarea versiune este încã în lucru.

În general, limbajul C++ prevede mai multe facilitãþi ºi mai puþine restricþii decât limbajul C, astfel încât majoritatea construcþiilor din C sunt legale ºi au aceeaºi semnificaþie ºi în C++.
În acest capitol sunt prezentate unitar ºi concis conceptele de bazã în programarea C++, atât cele care sunt preluate din limbajul C cât ºi cele nou introduse. Multe dintre ele sunt reluate ºi dezvoltate pe parcursul secþiunilor urmãtoare.

Cel mai compact program C++ este:
main(){ }
Acesta defineºte o funcþie numitã main (), care nu primeºte nici un argument, nu executã nimic ºi nu returneazã nici o valoare.
Dacã se doreºte ca programul sã scrie un mesaj la consolã (de tipul Hello, World!), pe lângã folosirea funcþiei obiºnuite din limbajul C (funcþia printf()), în C++ se poate utiliza ºi o funcþie de scriere la ieºirea standard (cout). Aceastã funcþie este funcþia operator de scriere << care este definitã în fiºierul antet iostream.h. Un astfel de program este urmãtorul:

#include <iostream.h>
void main(){
cout << “Hello, World!”<< endl;
}

Prima operaþie de scriere afiºeazã la consolã ºirul Hello, World!, iar urmãtoarea (endl) introduce caracterul de linie nouã. Operaþia de citire de la tastaturã poate fi realizatã în C++ printr-o instrucþiune care foloseºte funcþia operator de citire >>. De exemplu, în instrucþiunile care urmeazã se citeºte de la tastaturã un numãr întreg:

int i;
cin >> i;

Desigur, funcþia scanf() de citire de la tastaturã din limbajul C poate fi în continuare folositã, dar pe parcursul exemplificãrilor se vor folosi mai mult aceste funcþii C++ de citire ºi de scriere la consolã, iar descrierea detaliatã a operaþiilor de intrare-ieºire din C++ este prezentatã în secþiunea 6.

Un program C++ constã dintr-unul sau mai multe fiºiere (files). Un fiºier este o bucatã de text care conþine cod sursã C++ ºi comenzi de preprocesare ºi este translatat din punct de vedere conceptual în mai multe faze. Prima fazã este faza de preprocesare care executã includerea altor fiºiere ºi substituirea macro-urilor. Preprocesarea este controlatã prin intermediul directivelor introduse prin linii care au întâiul caracter #. Rezultatul preprocesãrii este secvenþa de entitãþi (token – semne). O astfel de secvenþã de entitãþi, adicã un fiºier rezultat dupã preprocesare, se numesºte unitate de translatare (translation unit).

Convenþii lexicale

Existã cinci tipuri de entitãþi: identificatori (identifiers), cuvinte-cheie (keywords), literale (literals), operatori (operators) ºi separatori (separators). Caracterele: spaþiu (blank), tabulatori orizontali ºi verticali (tabs), linie nouã (new line), caractere de formatare (formfeeds) ºi comentariile, numite în ansamblu spaþii albe (white spaces) sunt ignorate cu excepþia situaþiei îndată ce folosesc pentru separarea entitãþilor. Un spaþiu alb este necesar pentru separarea identificatorilor, a cuvintelor-cheie ºi a constantelor.
Comentariile din C, considerate între perechile de caractere /* ºi */ sunt valabile la fel, fãrã posibilitatea de a fi incluse unele în altele (imbricate). Caracterele // marcheazã începutul unui comentariu care dureazã pânã la sfârºitul liniei.

Identificatori. Un identificator este o secvenþã de lungime oarecare de litere ºi cifre, cu condiþia ca inițialul caracter sã fie literã sau caracterul de subliniere _ (underscore). Literele mici sunt deosebite de literele mari corespunzãtoare. Toate caracterele într-un identificator sunt semnificative.

Cuvinte-cheie. Urmãtorii identificatori sunt rezervaþi pentru a fi utilizaþi ca ºi cuvinte-cheie, ºi nu pot avea altã utilizare:

asm continuos float new signed try
auto default for operator sizeof typedef
break delete friend private static union
case do goto protected struct unsigned
catch double if public switch virtual
char else inline register template void
class enum int return this volatile
const extern long short hrow while

În plus, identificatori care conþin douã caractere de subliniere (underscore) sau încep cu un astfel de caracter sunt utilizaþi în implementãrile C++ ºi a bibliotecilor ºi se recomandã sã fie evitaþi.

Literale (constante). Constantele se referã la valori fixe, pe care programul nu le poate modifica. Exitã mai multe feluri de constante: constante întregi, constante caracter, constante reale ºi constante ºir de caractere.
O constantã întreg este reprezentatã ca o succesiune de cifre; ea este consideratã în bazã zecimalã dacã prima cifrã este diferitã de 0, în baza hexazecimalã dacã începe cu 0x sau 0X, sau în bazã octalã, dacã începe cu 0 (ºi acesta nu este urmat de x sau X). Tipul unei constante întregi depinde de valoarea acesteia ºi este astfel stabilit încât sã poatã cuprinde valoarea datã.
O constantã caracter este compusã din unul sau mai multe caractere cuprinse între ghilimele simple (de exemplu, ’x’). O constantã de un solitar caracter este de tipul char. Constantele multicaracter au tipul întreg. Trebuie remarcatã diferenþa faþã ce limbajul C, în care constantele caracter au tipul int.
O constantã realã (flotantã) este alcãtuitã dintr-o parte întreagã, punctul zecimal, o parte fracþionarã ºi opþional, un exponent întreg cu semn precedat de caracterul e sau E. Fie partea întragã, fie porțiunea fracþionarã, (dar nu amândouã) poate lipsi. Tipul constantei flotante este duble, dacã nu conþine un sufix care sã specifice explicit tipul (f sau F, pentru float; l sau L pentru long double).
O constantã ºir de caractere este o secvenþã de caractere cuprinsã între ghilimele duble ºi este de tipul vector de caractere. O constantã ºir de caractere are clasa de memorare static ºi se iniþializeazã cu caracterele date, la care se adaugã caracterul ‘\0’ (care are valoarea 0).
Este de asemenea posibil sã fie definite constante simbolice (constante cu nume). Acestea sunt prezentate în subsecþiunea urmãtoare.


Declaraþii, definiþii

Un nume (name) poate reprezenta un obiect, un tip, o enumeraþie, o funcþie, o mulþime de funcþii, un penis al unei clase, o valoare sau o etichetã. Un nume este introdus în program printr-o declaraþie (declaration). Un nume poate fi folosit numai într-o zonã a programului, denumitã domeniul numelui (scope).
Un obiect (object) este o regiune de memorie, iar semnificaþia valorilor care se aflã memorate într-un obiect depind de tipul lui. Orice obiect are o duratã de viaþã (lifetime) care depinde de clasa de memorare cãreia îi aparþine.
O declaraþie (declaration) introduce unul sau mai multe nume într-un program. Într-o declaraþie a unui nume se poate introduce, opþional, o expresie de iniþialzare (iniþializator) pentru acel nume (de exemplu: int i = 1;)
O definiþie (definition) stabileºte entitatea la care se referã numele respectiv. Ea rezervã cantitatea necesarã de memorie obiectului respectiv ºi executã iniþializãrile corespunzãtoare. O declaraþie este ºi o definiþie, cu excepþia urmãtoarelor situaþii:

conþine specificatorul extern fãrã o expresie de iniþializare sau corp al funcþiei;
este o declaraþie a unei funcþii fãrã specificarea corpului acesteia;
este o declaraþie a numelui unei clase;
este o declaraþie typedef;
este o declaraþie a unui membru de tip static al unei clase.

De exemplu, urmãtoarele sunt definiþii:

int a;
extern const c = 1;
int f(int x) {return x+1;}
enum {up, down};

în timp ce urmãtoarele sunt doar declaraþii:

extern int a;
extern const c;
int f(int);
struct S;
typedef int Int;

Trebuie sã existe o singurã definiþie a fiecãrui obiect, funcþie, clasã sau enumeraþie folositã în program. Dacã o funcþie nu este niciodatã apelatã sau dacã numele unei clase nu este niciodatã folosit într-un mod care sã necesite definiþia acesteia, ele pot sã nu fie definite. O declaraþie poate fi repetatã de mai multe ori în program, în timp ce definiþiile nu pot fi repertate. De exemplu:

struct S; // corect, redeclarare
struct S; // corect, redeclarare
int a;
int a; // eroare, redefinire

Domeniul de definiþie (scope) al unui nume este zona din program în care numele este cunoscut ºi poate fi folosit. Dat fiind cã un nume este fãcut cunoscut printr-o declaraþie, domeniile numelor se diferenþiazã în funcþie de locul în care este introdusã declaraþia în program. Existã patru categorii de domenii: local, funcþie, clasã ºi fiºier.
Domeniul local: un nume declarat într-un bloc (o secvenþã de instrucþiuni cuprinsã între douã acolade) este local blocului ºi poate fi folosit numai în acel bloc, începând din locul declaraþiei ºi pânã la sfârºitul bocului ºi în toate blocurile incluse dupã punctul de declaraþie. Argumentele formale ale unei funcþii sunt tratate ca ºi când ar fi declarate în blocul cel mai exterior al funcþiei repective.
Domeniul funcþie: un nume declarat într-o funcþie poate fi folosit în funcþia respectivã, începând din punctul de declaraþie ºi pânã la sfârºitul blocului în care se aflã declaraþia. Domeniul funcþie poate fi considerat un cay particula de domeniu local.
Domeniul clasã: Un nume al unui membru al unei clase este local clasei respective. Posibilitãþile de întrebuințare al acestor tipuri de nume vor fi prezentate ulterior.
Domeniul fiºier: Un nume declarat în afara oricãrui bloc sau clasã are ca domeniu fiºierul în care a fost declarat ºi poate fi utilizat din punctul declaraþiei pânã la sfârºitul fiºierului. Numele cu domeniu fiºier se numesc globale.

Domeniu de vizibilitate. Un nume este vizibil în întregul sãu domeniu de definiþie dacã nu este redefinit într-un bloc inclus în domeniul respectiv. Dacã într-un bloc interior domeniului unui nume se redefineºte (sau se redeclarã) acelaºi nume, atunci numele iniþial (din blocul exterior) este parþial ascuns, ºi anume în tot domeniul redeclarãrii. De exemplu:

void fv1()
{
int i = 10; // definitie variabila i
{
// in acest bloc var. i din blocul exterior
// este ascunsa datoritã redefinirii
int i = 100;
cout << i << endl; // afiseaza 100
}
cout << i << endl; // afiseaza 10
}

Un nume cu domeniu fiºier poate fi accesat într-un domeniu în care este ascuns prin redefinire, dacã se foloseºte operatorul de rezoluþie pentru nume globale (operatorul :: fãrã nici un nume în faþa lui).
Redefinirea unui nume este admisã numai în domenii diferite. Dacã unul din domenii este adăugat în celãlalt domeniu, atunci redefinirea provoacã ascunderea numelui din domeniul exterior în domeniul interior. Redefinirea în domenii identice produce eroare de compilare.

Durata de viaþã a obiectelor. Un obiect este creat atunci când se întâlneºte definiþia lui (care este unicã) ºi este distrus (în mod automat) atunci când se pãrãseºte domeniul lui de definiþie. Un obiect cu un nume global se creazã ºi se iniþializeazã o singurã datã ºi are durata de viaþã pânã la terminarea programului. Obiectele locale se creazã de fiecare datã când execuþia programului ajunge în punctul de definire a acestora, cu excepþia variabilelor locale declarate de tip static.
O variabilã (obiect) se declarã de tip static prin prefixarea declaraþiei acesteia cu cuvântul-cheie static. De exemplu, execuþia programului:

#include <iostream.h>
int a = 0; // variabila globala, se initializeaza
// inainte de începerea executiei
void f(){
int b = 1; // se creaza si se initializeaza
// la fiecare apel al functiei f()
a++; b++;
static int c = a; //se initializeaza o singura data
//la prima executie a instruct.
c += 2;
cout << “a = “<<a <<” b = “<< b<<” c =”<< c<<endl;
}

void main (){
for (int i=0;i<3;i++)
f();
}

produce mesajele:

a = 1 b = 2 c = 3
a = 2 b = 2 c = 5
a = 3 b = 2 c = 7

O variabilã (obiect) globalã sau staticã, care nu este iniþializatã explicit, este iniþializatã automat cu 0.
În afara acestui mod de creare a obiectelor, se mai pot crea obiecte în memoria liberã (heap), a cãror duratã de viaþã este controlatã explicit întrebuințând funcþii sau operatori de alocare. Acest mod de creare a obiectelor este prezentat în subsecþiunea 2.4.

Categorii de memorare. Existã patru specificatori de categorii de memorare a obiectelor: auto, static, register, extern.
Obiectele care sunt declarate automatice (folosind specificatorul auto la începutul declaraþiei) sunt obiecte locale (declarate într-un bloc) care se iniþializeazã la fiecare invocare a blocului. întrebuințarea acestui specificator este redundantã ºi rareori este folositã.
O declaraþie register este o declaraþie auto care mai indicã în plus compilatorului faptul cã acel obiect este intens folosit ºi, ca urmare, compilatorul va încerca sã-i aloce spaþiu de memorare într-un registru al procesorului.
Un obiect global poate fi declarat o singurã datã într-unul din fiºierele programului. Pentru a fi știut ºi în alte fiºiere din program, în celelate fiºiere se declarã acel obiect utilizând specificatorul extern.
Un obiect declarat folosind specificatorul static este memorat permanent ºi nu este iniþializat decât o singurã datã. Un astfel de obiect nu este cunoscut decât în interiorul fiºierului sau funcþiei în care este declaratã ºi nu poate fi declarat extern. Se pot remarca cele douã semnificaþii ale specificatorului static: o semnificaþie se referã la domeniul de vizibilitate, pe care îl restrânge la nivel de funcþie, respectiv fiºier; cealaltã semnificaþie se referã la clasa de memorare ºi asigurã o memorare permanentã a obiectului ºi o duratã de viaþã egalã cu durata de execuþie a programului.
Aceastã dublã acþiune a specificatorului static diferenþiazã comportamentul unui obiect declarat static dupã domeniul lui de definiþie.
Astfel, un obiect global de tip static este memorat permanent, dar este cunoscut numai în fiºierul în care a fost declarat. În aceastã situaþie, specificatorul static are doar rolul de a restrânge demeniul de vizibilitate al obiectului.
Pentru un obiect local specificatorul static are rolul de a modifica clasa de memorare: obiectul are domeniu de definiþie local (este recunoscut numai în blocul în care a fost declarat), dar este memorat permanent ºi îsi pãstreazã valorile între invocãri succesive ale blocului respectiv.


Tipuri

Fiecare nume într-un program C++ are un tip asociat lui, care determinã ce operaþii se pot aplica entitãþii la care se referã acest nume.
Un nume folosit pentru a specifica tipul unui alt nume într-o declaraþie este un nume de tip. Singurele operaþii care se pot aplica unui nume de tip sunt: sizeof, (care determinã cantitatea de memorie necesarã memorãrii unuii obiect de acel tip) ºi new (operaþia de alocare în memoria liberã a unui obiect de tipul respectiv).

1.1.1Tipuri fundamentale

În C++ sunt definite urmãtoarele tipuri fundamentale:

Tipuri de întreg, pentru definirea numerelor întregi de diferite dimensiuni (ca numãr de octeþi ocupaþi în memorie):

char 1 octet
short int 2 octeþi
int 2 sau 4 octeþi
long 4 sau 8 octeþi

Tipuri de numere flotante, pentru definirea numerelor reale (reprezentate ca numere cu virgulã flotantã):

float 4 octeþi
double 8 octeþi
long double 12 sau 16 octeþi

Aceste tipuri sunt denumite împreunã tipuri aritmetice. Pentru tipurile întreg, existã variante de declaraþie cu semn (signed) ºi fãrã semn (unsigned).

Tipul void specificã o mulþime vidã de valori. Nu se poate declara un obiect cu acest tip, dar acest tip poate fi utilizat în conversii de pointeri ºi ca tip de returnare a unei funcþii

1.1.2Tipuri derivate

Se pot defini conceptual un numãr infinit de tipuri derivate pornind de la tipurile fundamentale. Tipurile derivate sunt:

tablouri de obiecte,
pointeri la obiecte,
referinþe,
funcþii,
constante,
clase, structuri, uniuni,
pointeri la membrii claselor.

În continuare se vor prezenta primele cinci tipuri derivate, iar celelate vor fi introduse pe parcursul secþiunii urmãtoare. Ca terminologie, clasele (împreunã cu structurile ºi uniunile) sunt denumite tipuri definite de utilizator (user-defined types), iar celelate tipuri sunt denumite tipuri predefinite (built-in types)


1.1.2.1Tablouri de obiecte

Un tablou (array) de obiecte poate fi construit din obiecte dintr-un tip fundamental (cu excepþia tipului void), din pointeri, din enumeraþii sau din alte tablouri. În traducere, pentru array se mai întâlnesc termenii vector ºi matrice. În acest text sunt folosiþi termenii tablou (pentru array multidimensional) ºi vector (pentru array unidimensional).
Declaraþia: T D[expresie] introduce un tablou de obiecte de tipul T, cu numele D ºi cu un numãr de elemente al tabloului dat de valoarea expresiei, care trebuie sã fie de tip constant întreg. Pentru valoarea N a acestei expresii, tabloul are N elemente, numerotate de la 0 la N-1.
Un tablou bidimensiunal se poate construi printr-o declaraþie de forma:
T D[dim1][dim2];
ºi reprezintã dim1 tablouri unidimensionale, fiecare de mărime dim2. Elementele tabloului bidimensional se memoreazã cu valori succesive pentru indicele din dreapta astfel:
D[0][0], D[0][1], … D[0][dim2-1],
D[1][0], D[1][1], … D[1][dim2-1],……….
D[dim1-1][0], D[dim1-1][1],… D[dim1-1][dim2-1].

Într-un mod asemãnãtor se pot construi tablouri multidimensionale, cu o limitare a numãrului de dimensiuni care depinde de impelementare.

1.1.2.2Pointeri

Pentru majoritatea tipurilor T, T* este un tip denumit “pointer la T”, adicã o variabilã de tipul T* memoreazã adresa unui obiect de tipul T.
Operaþia fundamentalã asupra unui pointer este operaþia de dereferenþiere (dereferencing), adicã accesarea obiectului a cãrui adresã o reprezintã pointerul respectiv. Operatorul de dereferenþiere este operatorul unar *. De exemplu:

char c1 = ‘a’;
char* p1 = &c1; // p memoreazã adresa lui c1
char c2 = *p1; // dereferentiere, c2 = ‘a’;

Operatorul & este operatorul adresã, care se utilizeazã pentru a se obþine adresa unei variabile.
Tipul void* este folosit pentru a indica adresa unui obiect de tip necunoscut.
Asupra pointerilor sunt admise unele operaþii aritmetice. Ca exemplu, se considerã un vector de caractere dintre care ultimul este caracterul 0 (se mai numeºte ºir de caractere terminat cu 0). Pentru calculul numãrului de caractere se pot folosi operaþii cu pointeri astfel:

int strlen(char* p){
int i = 0;
while (*p++) i++;
return i;
}

Funcþia strlen() returneazã numãrul de caractere ale ºirului, fãrã caracterul terminal 0, folosind operaþia de incrementare a pointerului ºi operaþia de dereferenþiere pentru a testa valoarea caracterului. O altã implementare posibilã a funcþiei este urmãtoarea:

int strlen(char* p){
char* q = p;
while (*q++);
return q-p-1;
}

În C++, ca ºi în limbajul C, pointerii ºi tablourile sunt puternic corelate. Un nume al unui tablou poate fi folosit ca un pointer la primul element al tabloului. De exemplu, se poate scrie:

char alpha[] = “abcdef”;
char* p = alpha;
char* q = &alpha[0];

Rezultatul aplicãrii operatorilor aritmetici +, -, ++, -- asupra pointerilor depinde de tipul obiectului indicat. Atunci când se aplicã un operator aritmetic unui pointer p de tip T*, se considerã cã p indicã un element al unui tablou de obiecte de tip T; p+1 va indica urmãtorul element al tabloului, iar p-1 va indica elementul precedent al tabloului. Acest lucru înseamnã cã valoarea lui p+1 este cu sizeof(T) octeþi mai mare decât valoarea lui p.
Pointeri la funcþii vor fi prezentaþi la paragraful de descriere a funcþiilor. Pointerii la membrii nestatici ai claselor nu sunt consideraþi pointeri la obiecte ºi vor fi prezentaþi în secþiunea urmãtoare.
Vezi profilul utilizatorului Trimite mesaj privat

[C++]Manual C++ part. 1
 Pagina de start a forumului http://alpha-thema-online.uv.ro » C / C++ / C#
Nu puteti crea un subiect nou in acest forum
Nu puteti raspunde in subiectele acestui forum
Nu puteti modifica mesajele proprii din acest forum
Nu puteti sterge mesajele proprii din acest forum
Nu puteti vota in chestionarele din acest forum
Ora este GMT + 3 ore  
Pagina 1 din 1  

  
  
 Creaza un subiect nou  Raspunde la subiect  


Fa-ti si tu propriul forum GRATUIT, pe www.myforum.ro
    Powered by phpBB © 2001-2004 phpBB Group. phpBB Skin by Vjacheslav Trushkin.