Filehost.ro - gazduire fisiere
RSB_Team
Ne-am mutat pe http://forum.rsb-team.com
Nou pe simpatie:
simpatica_dorina Profile
Femeie
25 ani
Arad
cauta Barbat
32 - 44 ani
RSB_TeamReguliInregistrareLoginPozeNu sunteti logat. Lista Forumurilor Pe Tematici
RSB_Team / Programare /

C++

Pagini: 1  
#1
byjunior
Master
Din: Lost city
Postari: 108
Capitolul 1: Noţiuni introductive

În acest capitol veţi învăţa despre:
•    Cum adaugă C++ conceptele orientării spre obiecte la limbajul C
•    Cum adaugă C++ conceptele programării generice la limbajul C
•    Istoria şi filozofia limbajului C
•    Programarea procedurală contra programarea orientată spre obiecte
•    Istoria şi filozofia limbajului C++
•    Standardele unui limbaj de programare
•    Dinamica creării unui program
•    Convenţii utilizate în această carte

Bine aţi venit în lumea C++! Acest limbaj pasionant, care combină limbajul C cu suportul pentru programarea orientată spre obiecte, a devenit unul dintre cele mai importante limbaje de programare al anilor ‘90 şi promite să continue în forţă şi în anii 2000. Moştenirea din C aduce lui C++ tradiţia unui limbaj eficient, compact, rapid şi portabil. Moştenirea orientată spre obiecte aduce lui C++ o metodologie de programare proaspătă, proiectată să învingă greutăţile produse de complexitatea sarcinilor de programare moderne. Noile sale caracteristici şablon îmbunătăţite aduc acum o altă metodologie nouă de programare, programarea generică. Această moştenire triplă este atât o binecuvântare cât şi un blestem. Îl transformă într-un limbaj foarte puternic, dar aceasta înseamnă că sunt şi foarte multe de învăţat.
În acest capitol vom cerceta fundamentele lui C++ şi vom parcurge unele reguli de bază pentru crearea programelor C++. Celelalte capitole ale cărţii vă vor învăţa să utilizaţi limbajul C++, pornind de la bazele simple ale limbajului, până la gloria programării orientate spre obiecte (OOP – Object Oriented Programming) şi suita noului jargon aferent – obiecte, clase, încapsulare, ascunderea datelor, polimorfism şi moştenire, precum şi suportul său pentru programarea generică. (Desigur, învăţând C++, aceste noţiuni se vor transforma din elemente de jargon într-un vocabular necesar unui discurs elevat.)
Studiul C++
C++ combină trei tradiţii de programare diferite – tradiţia limbajului procedural, reprezentată de C; tradiţia limbajului orientat spre obiecte, reprezentată de îmbunătăţirile aduse de către clasele C++ la C şi programarea generică, asigurată de şabloanele C++. Acest capitol va trece în revistă, pe scurt, aceste tradiţii. Dar, pentru început, haideţi să ne gândim la ce aduce această moştenire în studiul C++. Un motiv pentru a folosi C++ este acela că vă permite să vă însuşiţi caracteristicile sale orientate spre obiecte. Pentru acest lucru aveţi nevoie de un fundament solid în limbajul C standard deoarece acesta furnizează tipurile de bază, operatorii, structurile de control şi regulile de sintaxă. Deci, dacă stăpâniţi deja limbajul C, atunci sunteţi pregătit să învăţaţi C++. Dar nu este vorba numai de învăţarea câtorva cuvinte cheie sau a câtorva construcţii. Trecerea de la C la C++ presupune tot atâta străduinţă câtă aţi avut nevoie pentru a învăţa C. De asemenea, în cazul în care cunoaşteţi limbajul C trecând la C++ va trebui să renunţaţi la unele obiceiuri de programare. Dacă nu cunoaşteţi limbajul C pentru a învăţa C++ trebuie să stăpâniţi componentele C, componentele OOP şi componentele generice, dar nu va trebui să vă dezobişnuiţi de anumite obiceiuri de programare. Dacă aţi început să vă gândiţi că învăţarea limbajului C++ poate implica un efort intelectual intens din partea dumneavoastră, nu greşiţi. Această carte vă va ghida de-a lungul întregului proces, într-o manieră clară, pas cu pas, astfel încât efortul intelectual depus să nu vă descurajeze.
C++ - Manual complet abordează limbajul C++ învăţându-vă atât bazele sale din C cât şi noile sale componente, deci în această carte se presupune că nu aveţi cunoştinţe anterioare de C. Veţi începe cu învăţarea caracteristicilor pe care C++ le împarte cu C. Chiar dacă stăpâniţi limbajul C poate că veţi considera această parte a cărţii ca fiind o recapitulare binevenită. De asemenea, evidenţiază unele concepte care vor fi importante mai târziu şi indică, acolo unde este cazul, diferenţele dintre C++ şi C. După ce veţi avea o temelie solidă a limbajului C, la aceasta veţi adăuga suprastructura lui C++. Aici veţi învăţa despre obiecte, clase şi despre modul în care sunt acestea implementate de către C++. Şi veţi învăţa şi despre şabloane.
Această carte nu intenţionează să fie o enciclopedie completă a limbajului C++, deci nu va explora fiecare colţişor a limbajului. Dar, veţi învăţa toate caracteristicile importante ale limbajului, inclusiv unele cum ar fi şabloanele, excepţiile şi zonele de nume (N.T.: namespace = zonă de nume, termen fără echivalent în limba română, caracteristică nou introdusă în C++ prezentată pe larg în Capitolul 8), caracteristici adăugate recent.
Acum haideţi să aruncăm o scurtă privire asupra evoluţiei limbajului C++.

Scurt istoric
În ultimele câteva decade tehnologia calculatoarelor a evoluat cu o viteză uimitoare. Un laptop de azi poate calcula mai rapid şi poate stoca mai multe informaţii decât calculatoarele mainframe de acum treizeci de ani. (Mulţi programatori îşi pot reaminti de ofrandele de cartele perforate duse pentru cercetare la un sistem de calcul puternic care ocupa o cameră şi dispunea de o măreaţă memorie de 100 KB – memorie insuficientă azi chiar şi pentru rularea pe un calculator personal a unui joc bun.) De asemenea au evoluat şi limbajele de programare. Schimbările nu par chiar atât de dramatice dar sunt importante. Calculatoarele mari şi mai puternice permit crearea de programe mai mari şi mai complexe care, la rândul lor, ridică noi probleme în gestionarea şi întreţinerea programelor.
În anii ’70, limbaje cum ar fi C şi Pascal au contribuit la inaugurarea erei programării structurate, o filozofie care a adus întrucâtva ordine şi disciplină într un domeniu care avea o nevoie disperată de aceste calităţi. Pe lângă asigurarea instrumentelor pentru programarea structurată, limbajul C realiza şi programe compacte şi rapide care aveau abilitatea de a accesa direct hardware-ul, cum ar fi gestionarea porturilor de comunicare şi a unităţilor de disc. Aceste talente au ajutat limbajul C să devină limbajul de programare dominant al anilor ’80. Între timp, anii ’80 au fost martorii dezvoltării unei noi concepţii în programare: programarea orientată spre obiecte, sau OOP, care s a întrupat în limbaje cum ar fi SmallTalk şi C++. Să examinăm mai îndeaproape aceste două evoluţii (C şi OOP).

Limbajul C
La începutul anilor ’70, Dennis Ritchie, de la Bell Laboratories, lucra la un proiect de dezvoltare a sistemului de operare UNIX. (Un sistem de operare reprezintă un set de programe care gestionează resursele unui calculator şi asigură o interfaţă între utilizator şi sistemul de calcul. De exemplu, sistemul de operare este cel care afişează pe ecran prompterul sistem şi cel care vă rulează programele.) Pentru acest proiect Ritchie avea nevoie de un limbaj care să fie concis, să poată realiza programe compacte şi rapide şi care să poată controla eficient hardware-ul. În mod tradiţional, pentru a satisface aceste cerinţe, programatorii apelau la limbajul de asamblare care este foarte apropiat de codul maşină – limbajul intern al calculatorului. Totuşi, limbajul de asamblare este un limbaj de nivel jos, specific unui anumit procesor. Deci, dacă doriţi să mutaţi un program scris în limbaj de asamblare pe un alt tip de calculator este posibil să fiţi nevoit să rescrieţi programul în totalitate folosind un alt limbaj de asamblare. Era ca şi cum de fiecare dată când cumpăraţi o maşină nouă să observaţi că designerii s au hotărât să modifice locul şi rolul controalelor, forţându vă să învăţaţi din nou să conduceţi. Dar UNIX era menit să lucreze pe diferite tipuri de calculatoare (sau platforme). Aceasta sugera utilizarea unui limbaj de nivel înalt. Un limbaj de nivel înalt nu depinde de un anumit hardware şi este orientat spre rezolvarea problemelor. Programe speciale, numite compilatoare, traduc un limbaj de nivel înalt într un limbaj intern al unui anumit calculator. Astfel, puteţi utiliza acelaşi program în limbaj de nivel înalt, pe diferite platforme, utilizând compilatoare separate pentru fiecare platformă. Ritchie dorea un limbaj care să combine eficienţa limbajului de nivel jos şi accesul hardware cu generalitatea şi portabilitatea limbajului de nivel înalt. Deci el a construit limbajul C prin combinarea unor limbaje mai vechi.

Filozofia programării în C
Deoarece C++ aduce în limbajul C o nouă filozofie de programare, pentru început ar trebui să studiem filozofia mai veche pe care se bazează limbajul C. În general, limbajele de programare lucrează cu două concepte – date şi algoritmi. Datele reprezintă informaţia utilizată şi procesată de către un program. Algoritmii sunt metodele utilizate de către program (vezi Figura 1.1). Asemenea celor mai multe limbaje consacrate, limbajul C este un limbaj procedural. Aceasta înseamnă că el accentuează partea de algoritmi a programării. Din punct de vedere conceptual programarea procedurală constă din înţelegerea acţiunilor care ar trebui făcute de către un calculator şi apoi implementarea acestor acţiuni utilizând limbajul de programare. Un program fixează un set de proceduri care trebuie urmate de către un calculator pentru a produce un anumit rezultat, adică se aseamănă cu o reţetă care descrie un set de proceduri care trebuie urmate de către un bucătar pentru a pregăti o prăjitură.
Primele limbaje procedurale, cum ar fi FORTRAN şi BASIC, au început să întâmpine probleme de organizare pe măsură ce programele au devenit mai mari. De exemplu, programele utilizează deseori instrucţiuni de ramificare care dirijează execuţia unui sau altui set de instrucţiuni în funcţie de rezultatul unui anumit test. Multe programe vechi aveau secvenţe de execuţie atât de încurcate (numite „programare spaghetti”) încât era aproape imposibil să înţelegi un program citindu-l, iar modificarea unui astfel de program era o invitaţie la dezastru. Drept urmare informaticienii au dezvoltat un stil de programare mai disciplinat numit programare structurată. Limbajul C conţine caracteristici care facilitează această abordare. De exemplu, programarea structurată limitează ramificările (alegerea instrucţiunii care urmează a fi executată la un mic set de construcţii cu un comportament manierat. Limbajul C conţine aceste construcţii (bucla for, bucla while, bucla do while şi instrucţiunea if else) în vocabularul propriu.

Date            Algoritmi
½ ceaşcă unt        omogenizaţi untul
1 ceaşcă zahăr        adăugând treptat zahărul
2 ouă            spargeţi ouăle
…            …
Program
Figura 1.1 Date + algoritmi = program.

Proiectarea descendentă era un alt principiu nou. Ideea este de a împărţi programele mari în sarcini mai mici şi mai uşor de gestionat. Dacă una dintre acestea este încă prea vastă împărţiţi-o şi pe acesta în altele mai mici. Continuaţi astfel până când programul va fi împărţit în module mici, uşor de programat. (Faceţi ordine în camera de lucru. Aoleu! Ei bine, faceţi ordine în birou, în fişet şi aranjaţi-vă cărţile pe raft. Aoleu! Ei bine, începeţi cu biroul şi faceţi ordine în fiecare sertar, începând cu cel din mijloc. Hmm, poate asta o să îmi iasă.) Design-ul limbajului C uşurează această abordare încurajându-vă să dezvoltaţi unităţi de program, numite funcţii, care reprezintă module de sarcini individuale. După cum poate că aţi observat deja, tehnicile programării structurate reflectă o concepţie procedurală gândind un program din punctul de vedere al acţiunilor realizate de acesta.

Programarea orientată spre obiecte
Cu toate că principiile programării structurate îmbunătăţesc claritatea şi fiabilitatea şi uşurează întreţinerea programelor, totuşi programarea la scară largă rămâne o provocare. Programarea orientată spre obiecte (OOP) aduce un alt mod de abordare a acestei provocări. Spre deosebire de programarea procedurală care accentuează algoritmii, OOP pune accentul pe date. În loc să încerce să potrivească problema la abordarea procedurală a limbajului, OOP încearcă să potrivească limbajul la problemă. Ideea este de a proiecta formatele datelor astfel încât să corespundă caracteristicilor esenţiale ale unei probleme.
În C++, o clasă este o specificaţie care descrie un nou format de date, iar un obiect este o structură de date particulară construită conform acestui plan. De exemplu, o clasă poate descrie proprietăţile generale ale unui membru din conducerea unei corporaţii (cum ar fi numele, funcţia, salariul sau aptitudini neobişnuite), în timp ce un obiect va reprezenta un anumit membru (Guilford Sheepblat, vicepreşedinte, 325000$, ştie să utilizeze fişierul CONFIG.SYS). În general, o clasă defineşte ce date sunt folosite pentru a reprezenta un obiect şi ce operaţii pot fi realizate asupra acelor date. De exemplu, să presupunem că dezvoltaţi un program de desenare pe calculator capabil să deseneze un dreptunghi. Puteţi defini o clasă care să descrie un dreptunghi. Partea de date a specificaţiei poate include lucruri cum ar fi coordonatele vârfurilor, înălţimea şi lăţimea, culoarea şi stilul marginilor, respectiv culoarea şi modelul utilizat pentru umplerea dreptunghiului. Partea de operaţii a specificaţiei poate conţine metode pentru mutarea dreptunghiului, redimensionarea, rotirea, schimbarea culorilor şi modelelor acestuia, precum şi copierea dreptunghiului într-o altă locaţie. Dacă veţi utiliza programul dumneavoastră pentru a desena un dreptunghi, acesta va crea un obiect în funcţie de specificaţia clasei. Acest obiect va conţine toate datele care descriu dreptunghiul, iar pentru a modifica acest dreptunghi veţi putea utiliza metodele clasei. Dacă desenaţi două dreptunghiuri programul va crea două obiecte, câte unul pentru fiecare dreptunghi.
Abordarea OOP în proiectarea de programe presupune pentru început proiectarea claselor care vor reprezenta cu exactitate acele lucruri cu care va lucra programul. De exemplu, un program de desenare poate defini clase care să reprezinte dreptunghiuri, linii, cercuri, pensule, creioane şi altele. Definiţiile clasei, reţineţi, includ o descriere a operaţiilor permise pentru fiecare clasă, cum ar fi mutarea unui cerc sau rotirea unei linii. Apoi veţi continua cu proiectarea unui program utilizând obiectele acelor clase. Procesul de trecere de la un nivel de organizare inferior, cum sunt clasele, la un nivel superior, cum ar fi proiectarea programelor, se numeşte proiectare ascendentă.
Desigur în OOP există şi altceva nu numai asocierea de date şi metode în definiţia unei clase. De exemplu, OOP facilitează crearea de cod reutilizabil care în cele din urmă vă poate scăpa de munca suplimentară. Ascunderea informaţiilor protejează datele împotriva unui acces inadecvat. Polimorfismul vă permite să creaţi definiţii multiple pentru operatori şi funcţii, contextul programului determinând care definiţie va fi utilizată. Moştenirea vă permite să derivaţi clase noi pornind din clase vechi. După cum vedeţi, programarea orientată spre obiecte aduce multe idei noi şi necesită o abordare diferită a programării în comparaţie cu programarea procedurală. În loc să vă concentraţi asupra sarcinilor, vă concentraţi asupra reprezentării conceptelor. În loc să abordaţi o programare descendentă utilizaţi uneori o abordare ascendentă. Această carte vă va prezenta aceste aspecte prin multe exemple uşor de înţeles.
Proiectarea unei clase utile şi sigure poate fi un sarcină dificilă. Din fericire, limbajele OOP uşurează încorporarea claselor existente în programele proprii. Producătorii furnizează o varietate de biblioteci de clase utile, incluzând biblioteci de clase proiectate pentru a simplifica crearea de programe pentru medii cum ar fi Windows sau Macintosh. Unul dintre avantajele reale ale lui C++ este acela că vă permite să reutilizaţi şi să adaptaţi cu uşurinţă coduri existente, îndelung testate.

Programarea generică
Programarea generică este un alt model de programare susţinut de C++. Aceasta, ca şi OOP, are scopul de a simplifica reutilizarea codului şi foloseşte tehnica abstractizării conceptelor generale. Dar, în timp ce OOP accentuează aspectul de date al programării, programarea generică accentuează aspectul algoritmic. Iar centrul atenţiei este altul. OOP este un instrument pentru gestionarea proiectelor mari, în timp ce programarea generică furnizează instrumente pentru realizarea de sarcini obişnuite, cum ar fi sortarea datelor sau interclasarea listelor. Termenul generic înseamnă crearea de cod independent de tip. Datele C++ sunt de mai multe tipuri – întregi, numerice cu părţi fracţionare, caractere, şiruri de caractere, structuri compuse de diverse tipuri definite de utilizator. Dacă, de exemplu, doriţi să sortaţi date de diverse tipuri, în mod normal trebuie să creaţi funcţii de sortare separate pentru fiecare tip. Programarea generică presupune extinderea limbajului astfel încât să puteţi scrie funcţii pentru un tip generic (care nu este specificat) şi să le utilizaţi pentru o varietate de tipuri efective. Şabloanele C++ furnizează un mecanism pentru realizarea acestui lucru.

C++
Asemenea limbajului C, C++ şi-a început viaţa în laboratoarele Bell unde Bjarne Stroustrup a dezvoltat acest limbaj la începutul anilor ’80. El a afirmat că „C++ a fost proiectat în primul rând pentru ca eu şi prietenii mei să nu fim nevoiţi să programăm în limbajul de asamblare, în C sau în diferite limbaje moderne de nivel înalt. Scopul lui principal este acela de a uşura şi de a face mai plăcută scrierea de programe bune de către programatorii individuali” (Bjarne Stroustrup, The C++ Programing Language).
Stroustrup a fost mai preocupat să facă limbajul C++ util decât să impună filozofii sau stiluri de programare particulare. În determinarea caracteristicilor limbajului nevoile adevărate de programare sunt mult mai importante decât puritatea teoretică. Stroustrup a dezvoltat limbajul C++ din C, bazându-se pe concizia limbajului C, potrivirea sa la programarea sistem, disponibilitatea sa răspândită şi apropierea faţă de sistemul de operare UNIX. Aspectul OOP al limbajului C++ a fost inspirat de un limbaj de simulare pe calculator numit Simula67. Stroustrup a adăugat la limbajul C caracteristicile OOP fără a modifica semnificativ componenta C. Astfel, C++ este un superset al limbajului C, adică orice program valid C este de asemenea şi un program valid C++. Totuşi există unele discrepanţe minore, fără importanţă. Programele C++ pot utiliza biblioteci de programe C existente. Bibliotecile sunt colecţii de module de programare pe care le puteţi apela dintr-un program. Acestea furnizează soluţii demonstrate pentru multe probleme de programare uzuale, economisindu-vă astfel timp şi efort. Aceasta a ajutat la răspândirea C++.
Numele de C++ vine de la operatorul de incrementare ++ al limbajului C, care măreşte cu o unitate valoarea unei variabile. Dar de fapt, C++ sugerează şi o versiune îmbunătăţită a limbajului C.
Un program de calculator translatează o problemă reală într-o serie de acţiuni care trebuie efectuate de către un calculator. În timp ce aspectul OOP oferă limbajului C++ abilitatea de a se lega de conceptele problemei, partea de C oferă limbajului C++ abilitatea de a se apropia de hardware (vezi Figura 1.2). Această combinaţie de aptitudini a ajutat la răspândirea limbajului C++. De asemenea, presupune şi o modificare a gândirii atunci când treceţi de la un aspect al unui program la altul. (Într-adevăr, unii purişti OOP aseamănă adăugarea caracteristicilor OOP la C cu adăugarea de aripi unui porc chiar dacă acesta este unul deşirat şi eficient.) De asemenea, deoarece C++ adaugă OOP la limbajul C, puteţi ignora caracteristicile orientate spre obiecte ale C++. Dar dacă procedaţi astfel veţi avea multe de pierdut.
Stroustrup a adăugat şabloane, permiţând astfel programarea generică, numai după ce limbajul C++ a repurtat câteva succese. Şi abia după ce caracteristicile bazate pe şabloane au fost utilizate şi îmbunătăţite a devenit evident faptul că acestea erau poate la fel de semnificative ca şi OOP – sau chiar mai importante, ar spune unii. Faptul că limbajul C++ încorporează atât OOP cât şi programarea generică demonstrează faptul că C++ pune accentul pe utilitate şi nu pe abordarea ideologică, iar acesta este unul dintre motivele succesului obţinut de către acest limbaj.

Moştenirea OOP furnizează un nivel înalt de abstractizare.
                    ...
                    america_de_nord.arata();
                    ...
Moştenirea C furnizează un acces la hardware de nivel jos.
                    set byte at
                    address
                    01000 to 0
Figura 1.2 Dualitatea limbajului C++.

Portabilitate şi standarde
Aţi scris un program util în C++ pentru bătrânul PC 286 AT de la serviciu, când conducerea a hotărât să schimbe calculatorul dumneavoastră cu o staţie de lucru Sun, un calculator care utilizează un procesor diferit şi un alt sistem de operare. Puteţi rula programul dumneavoastră pe noua platformă? Bineînţeles, va trebui să recompilaţi programul folosind un compilator C++ proiectat pentru noua platformă. Dar va trebui să faceţi vreo modificare în codul scris de dumneavoastră? Dacă puteţi recompila programul fără a face modificări, iar acesta rulează fără nici o problemă, atunci spunem că programul este portabil.
Există însă nişte obstacole în calea portabilităţii, primul dintre ele fiind hardware-ul. Un program care este specific unui anumit hardware este puţin probabil să fie portabil. De exemplu, un program care controlează în mod direct o placă video IBM PC VGA, vorbeşte păsăreşte din punctul de vedere al unui calculator Sun. (Problemele de portabilitate le puteţi minimiza prin localizarea în module a părţilor dependente de hardware; va trebui să rescrieţi doar aceste module.) Însă, în această carte nu vom dezbate acest tip de programare.
Cel de-al doilea obstacol în calea portabilităţii îl reprezintă divergenţele de limbaj. În mod sigur, aceasta poate fi o problemă la limbile vorbite. Descrierea evenimentelor unei zile făcută de o persoană din Yorkshire poate să nu fie portabilă în Brooklyn, chiar dacă în ambele zone se vorbeşte limba engleză. Şi limbajele de calculator pot avea dialecte. Implementarea C++ pentru IBM PC este identică cu cea de la Sun? Cu toate că majoritatea implementatorilor ar dori să facă versiunile lor de C++ compatibile cu altele este dificil să realizeze acest lucru fără un standard publicat, care să descrie exact modul de funcţionare al limbajului. Din acest motiv, American National Standards Institute (ANSI) a creat în 1990 un comitet (ANSI X3J16) pentru a realiza un standard pentru C++. (ANSI dezvoltase deja un standard pentru limbajul C.) În scurt timp, International Standards Organization (ISO) s-a alăturat la acest proiect cu un comitet propriu (ISO–WG–21), eforturile ANSI/ISO aliindu-se pentru dezvoltarea standardului C++. Aceste comitete s-au întâlnit de trei ori pe an, dar noi îi vom aduna la un loc şi îi vom nota simplu – comitetul ANSI/ISO. Decizia comitetului ANSI/ISO de a crea un standard pentru limbajul C++ accentuează faptul că C++ a devenit un limbaj important şi cu o mare răspândire. De asemenea, aceasta indică şi faptul că C++ a ajuns la un anumit nivel de maturitate, deoarece nu este productiv să introduci standarde în timp ce un limbaj se află încă în dezvoltare accelerată. Cu toate acestea, de la începerea activităţii acestui comitet, limbajul C++ a suferit câteva modificări notabile.
Lucrul la standardul ANSI/ISO C++ a început în anul 1990. În anii care au urmat, comitetul a elaborat câteva documente de lucru provizorii. În luna aprilie a anului 1995, a fost publicată pentru a fi supusă discuţiei publice o schiţă numită Committee Draft (CD). Pentru o informare mai detaliată, în luna decembrie a anului 1996 a fost publicată o a doua versiune (CD2). Aceste documente nu numai că au perfecţionat descrierea caracteristicilor C++ existente, dar au adăugat la limbaj excepţiile, RTTI, şabloanele şi Standard Template Library (biblioteca de şabloane standard). Deseori, la rezumatele interimare şi la ciornele comitetului se făcea referire prin termenul de „draft standard”, dar primul document care a purtat oficial acest titlu a fost Final Draft International Standard (FDIS), publicat în noiembrie 1997. Documentul final, International Standard (IS), a fost ratificat în luna iunie a anului 1998. Această carte se bazează în special pe CD2 şi pe FDIS care este foarte asemănător cu acesta. Diferenţele dintre FDIS şi IS sunt de natură corectivă şi nu de adăugare sau modificare de caracteristici.
Pe lângă acestea, standardul ANSI/ISO C++ se bazează pe standardul ANSI C deoarece se presupune că, pe cât posibil, C++ este un superset al limbajului C. Aceasta înseamnă că orice program funcţional în C poate fi un program funcţional şi în C++. Desigur, există câteva diferenţe între ANSI C şi regulile corespondente pentru C++, dar acestea sunt minore. Într-adevăr, ANSI C conţine unele caracteristici care au fost introduse mai întâi în C++, cum ar fi prototipurile de funcţii şi calificatorul de tip const.
Înainte de apariţia standardului ANSI C, comunitatea C urma un standard de facto bazat pe cartea The C Programming Language  (Limbajul de programare C), scrisă de Kernighan şi Ritchie. Acest standard a fost adeseori numit K&R C; de la apariţia lui ANSI C, simplul K&R C este numit uneori C clasic.
Standardul ANSI C nu numai că defineşte limbajul C, ci defineşte de asemenea şi o bibliotecă standard C care trebuie suportată de către implementările ANSI C. Şi limbajul C++ utilizează această bibliotecă; în această carte ne vom referi la ea prin termenii biblioteca C standard sau biblioteca standard. În completare, comitetul ANSI/ISO C++ va furniza şi o bibliotecă standard a claselor limbajului C++.
Înainte ca să îşi înceapă activitatea comitetul ANSI/ISO, multe persoane acceptau drept standard ultima versiune C++ a laboratoarelor Bell. De exemplu, un compilator se poate autodescrie ca fiind compatibil cu versiunea 2.0 sau 3.0 a limbajului C++.
Înainte de a începe studiul limbajului C++, haideţi să aruncăm o privire asupra creării programelor şi asupra modului de utilizare a acestei cărţi.

Dinamica creării unui program
Să presupunem că scrieţi un program C++. Cum îl rulaţi? Paşii exacţi care trebuie urmaţi depind de mediul calculatorului dumneavoastră şi de compilatorul C++ pe care îl folosiţi, dar se aseamănă cu  următorii (vezi Figura 1.3):
•    Pentru a scrie programul şi pentru a-l salva într-un fişier, utilizaţi orice editor de texte. Acest fişier reprezintă codul sursă al programului dumneavoastră.
•    Compilaţi codul sursă. Aceasta înseamnă rularea unui program care traduce codul sursă în limbajul intern, numit limbaj maşină, utilizat de către calculatorul gazdă. Fişierul care conţine programul tradus se numeşte codul obiect al programului dumneavoastră.
•    Legaţi codul obiect cu codul adiţional. De exemplu, în mod normal programele C++ utilizează bibliotecile. O bibliotecă C++ conţine codul obiect al unei colecţii de rutine pentru calculator, numite funcţii, pentru a realiza sarcini cum ar fi afişarea de informaţii pe ecran sau calculul rădăcinii pătrate a unui număr. Legarea combină codul obiect al dumneavoastră cu codul obiect al funcţiilor utilizate de dumneavoastră şi cu unele coduri de iniţializare standard, pentru a realiza o versiune executabilă a programului dumneavoastră. Fişierul care conţine acest produs final se numeşte codul executabil.
În toată această carte veţi întâlni termenul de cod sursă, deci asiguraţi-vă că îl depozitaţi în memoria cu acces aleator personală.
Programele din această carte sunt generale şi ar trebui să ruleze pe orice sistem care suportă limbajul C++ modern. (Totuşi, la momentul scrierii acestei cărţi, multe compilatoare nu recunoşteau toate caracteristicile. De exemplu, numai câteva suportă zonele de nume şi noile caracteristici şablon.) Paşii necesari pentru crearea unui program pot diferi, aşa că haideţi să ne uităm mai atent la aceştia.

Crearea codului sursă
Unele implementări C++, cum ar fi Microsoft Visual C++, Borland C++ (diferite versiuni), Watcom C++, Symantec C++ şi Metrowerks Code Warrior, furnizează medii integrate de dezvoltare (integrated development environment - IDE), care vă permit să gestionaţi toţi paşii necesari dezvoltării unui program, inclusiv editarea, dintr-un program principal. Alte implementări, cum ar fi AT&T C++ sau GNU C++ pentru UNIX şi pentru Linux, realizează doar etapele de compilare şi de legare, iar comenzile trebuie introduse de către dumneavoastră în linia de comandă a sistemului. În aceste cazuri, pentru crearea sau modificarea unui cod sursă puteţi utiliza orice editor de texte. De exemplu, în UNIX puteţi utiliza vi, ed, ex sau emacs. Într-un sistem DOS puteţi utiliza edlin sau edit sau orice alt program de editare disponibil. Puteţi utiliza chiar şi un procesor de texte, dar fiţi atent să salvaţi fişierul ca un fişier text DOS ASCII standard în locul formatului special al procesorului de texte.
La denumirea fişierului sursă trebuie să utilizaţi sufixul potrivit pentru a putea identifica fişierul drept fişier C++. Acest lucru comunică nu numai dumneavoastră faptul că fişierul este un cod sursă C++, ci şi compilatorului. (Dacă un compilator UNIX vi se plânge din cauza unui „bad magic number” (număr magic incorect), acesta este doar modul său obscur şi drăgălaş de a vă comunica faptul că aţi utilizat un sufix greşit.) Sufixul constă dintr-un punct urmat de un caracter sau de un grup de caractere numit extensie (vezi Figura 1.4).

cod sursă
COMPILATOR
cod obiect
cod de iniţializare
PROGRAM DE LEGĂTURI
cod bibliotecă
cod executabil
Figura 1.3 Paşii programării.

                    splendid.cpp
                    un punct
numele de bază al fişierului                extensia numelui fişierului

Figura 1.4 Extensia fişierului sursă

Extensia pe care o utilizaţi depinde de implementarea C++. Tabelul 1.1 vă prezintă unele tipuri obişnuite. De exemplu, splendid.C este un nume de fişier valid pentru un cod sursă AT&T C++. Observaţi că UNIX este sensibil la tipul literelor, aceasta însemnând că va trebui să utilizaţi caracterul C. De fapt, este corectă şi extensia c, dar limbajul C standard utilizează această extensie. Deci, în UNIX, pentru a evita confuziile utilizaţi c pentru programe C şi C pentru programe C++. Dacă nu vă deranjează introducerea în plus a unui caracter sau două, în unele sisteme UNIX puteţi folosi extensiile cc şi cxx. Sistemul DOS, fiind un pic mai nătâng în comparaţie cu UNIX, nu face distincţie între majuscule şi litere mici, aşa că implementările DOS, după cum se vede şi în Tabelul 1.1, pentru a face distincţie între programele C şi C++ utilizează litere adiţionale.

Tabelul 1.1 Extensiile codului sursă.
Implementarea C++            Extensia codului sursă
UNIX AT&T                C, cc, cxx, c
GNU C++                C, cc, cxx, c
Symantec                cpp, cp
Borland C++                cpp
Watcom                cpp
Microsoft Visual C++            cpp, cxx
Metrowerks Code Warrior        cp, cpp

Compilare şi legare
Din start, Stroustrup a implementat C++ cu un program de compilare C++-la-C în loc să fi dezvoltat un compilator direct C++-la-cod obiect. Acest program, numit cfront (pentru C front end), traducea codul sursă C++ în cod sursă C care putea fi apoi compilat cu un compilator C standard. Această abordare a uşurat introducerea limbajului C++ în comunitatea C. Pentru a aduce C++ şi pe alte platforme, şi alte implementări au utilizat această abordare. Când C++ a început să se dezvolte şi să crească în popularitate, din ce în ce mai mulţi implementatori au început să creeze compilatoare C++ care să genereze codul obiect direct din codul sursă C++. Această abordare directă accelerează procesul de compilare şi accentuează faptul că deşi este asemănător cu C, totuşi C++ este un limbaj diferit.
Deseori, diferenţa dintre un translator cfront şi un compilator este aproape invizibilă pentru utilizator. De exemplu, pe un sistem UNIX, comanda CC poate să trimită prima dată programul dumneavoastră translatorului cfront şi apoi ieşirea translatorului să o trimită imediat compilatorului C, care se numeşte cc. De acum înainte vom folosi termenul „compilator” pentru a ne referi la combinaţia traducere-şi-compilare. Dinamica procesului de compilare depinde de implementare, iar următoarele paragrafe vor schiţa câteva dintre cele mai obişnuite forme. Aceste rezumate subliniază paşii de bază, dar nu vă scutesc de consultarea documentaţiei sistemului dumneavoastră.

Compilare şi legare în UNIX
Să presupunem că, de exemplu, aveţi un sistem UNIX care utilizează AT&T C++ versiunea 3.0. Pentru a compila programul dumneavoastră utilizaţi comanda CC. Numele este scris cu majuscule pentru a nu-l confunda cu compilatorul C standard din UNIX, cc. Compilatorul CC este un compilator în linie de comandă, prin aceasta înţelegând faptul că introduceţi comenzile de compilare în linia de comenzi UNIX.
De exemplu, pentru a compila fişierul cod sursă C++, splendid.C, la prompterul UNIX va trebui să introduceţi comanda:
CC splendid.C
Dacă, din cauza îndemânării, pasiunii sau norocului, programul dumneavoastră nu conţine erori, atunci compilatorul generează un fişier cod obiect, având extensia o. În cazul nostru compilatorul va realiza fişierul splendid.o.
În continuare, compilatorul va trimite automat fişierul cod obiect către programul de legături al sistemului care va combina codul dumneavoastră cu codul bibliotecii, pentru a realiza fişierul executabil. În mod prestabilit, fişierul executabil se numeşte a.out. Dacă aţi utilizat doar un singur fişier sursă programul de legături va şterge fişierul splendid.o deoarece nu mai este necesar. Pentru a rula programul introduceţi numele fişierului executabil:
a.out
Observaţi că dacă veţi compila un program nou, noul fişier executabil a.out îl va înlocui pe cel precedent. (Aceasta deoarece fişierele executabile ocupă mult spaţiu, deci suprascrierea vechilor fişiere executabile ajută la reducerea nevoilor de stocare.) Dar dacă aţi realizat un program executabil pe care doriţi să îl păstraţi, utilizaţi comanda UNIX mv pentru a modifica numele fişierului executabil.
La fel ca şi în C, şi în C++ puteţi face ca un program să fie format din mai multe fişiere. (Multe dintre programele din Capitolele 8 – 16 ale acestei cărţi, sunt realizate astfel.) În acest caz puteţi compila un program prin introducerea în linia de comandă a listei de fişiere:
CC almeu.C pretios.C
Dacă sunt mai multe fişiere cod sursă compilatorul nu va şterge fişierele cod obiect. În acest fel, dacă aţi modificat numai fişierul almeu.C, atunci puteţi recompila programul cu această comandă:
CC almeu.C pretios.o
Această comandă recompilează fişierul almeu.C şi îl leagă la fişierul pretios.o, compilat anterior.
Este posibil să fiţi nevoit să identificaţi explicit anumite biblioteci. De exemplu, pentru a accesa funcţii definite în biblioteca matematică poate că va trebui să adăugaţi în linia de comandă indicatorul –lm.
CC utilmate.C –lm
Free Software Foundation furnizează compilatorul GNU C++, numit g++, care funcţionează asemănător cu compilatorul UNIX standard:
g++ splendid.C
Unele versiuni vă pot cere să legaţi biblioteca C++:
g++ splendid.C –lg++
GNU g++ este disponibil pentru mai multe platforme, inclusiv pentru sisteme Linux care rulează pe calculatoare compatibile IBM PC.

Turbo C++ 2.0 şi Borland C++ 3.1 (DOS)
În versiunile DOS ale mediilor integrate Turbo C++ şi Borland C++, care conţin un editor încorporat, pentru a vă face cunoscute intenţiile utilizaţi o bară meniu accesibilă prin intermediul mouse-ului sau prin intermediul tastei Alt în combinaţie cu alte taste. De exemplu, meniul File vă permite să creaţi, să salvaţi sau să deschideţi fişiere. Meniul Edit vă asistă în editarea fişierului dumneavoastră sursă. Meniul Compile vă oferă o serie de opţiuni de compilare, iar meniul Run conţine opţiuni pentru rularea programului. După ce pentru a scrie programul aţi utilizat editorul încorporat, cea mai simplă alegere o reprezintă opţiunea Run din meniul Run. La alegerea acestei opţiuni Borland C++ sau Turbo C++ va compila, lega şi rula programul dumneavoastră. Evident, dacă compilatorul va depista erori nu va rula programul, dar va afişa lista erorilor şi va evidenţia liniile cu erori din codul sursă al dumneavoastră. De asemenea, mediul integrat include un depanator care vă permite să parcurgeţi pe rând fiecare linie a programului şi să examinaţi orice valoare doriţi.
Dacă dezvoltaţi un program utilizând mai mult de un singur fişier sursă, pentru a deschide un nou proiect utilizaţi meniul Project. Apoi, pentru a adăuga alte fişiere necesare la o listă proiect puteţi utiliza celelalte opţiuni ale meniului. Fişierul proiect permite lui Borland C++ sau lui Turbo C++ să urmărească ceea ce se întâmplă. Dacă modificaţi unul dintre fişierele din lista proiect, compilatorul va şti că trebuie să actualizeze programul executabil. În Borland C++ sau Turbo C++ puteţi avea deschise simultan mai multe fişiere sursă, fiecare având propria sa fereastră şi puteţi comuta cu uşurinţă de la un fişier la altul.
Atât Borland C++ cât şi Turbo C++ au un program tutorial care vă arată toate detaliile mediului Borland C++ sau Turbo C++. Şi, desigur, puteţi citi manualele.

Compilatoare Windows
Produsele Windows sunt prea abundente şi sunt revizuite mult prea des pentru a fi rezonabilă descrierea individuală a lor. Totuşi, şi acestea au unele caracteristici comune.
De obicei, pentru un program trebuie să creaţi mai întâi un proiect la care să adăugaţi apoi fişierul sau fişierele constituente ale programului. Fiecare furnizor va oferi un IDE (Integrated Development Environment – mediu integrat de dezvoltare), cu opţiuni meniu şi poate cu asistenţă automată în crearea unui proiect. Un lucru foarte important pe care trebuie să îl stabiliţi este tipul programului pe care îl creaţi. În mod obişnuit, compilatorul va oferi mai multe opţiuni, cum ar fi aplicaţie Windows, aplicaţie Windows MFC, bibliotecă cu legare dinamică (DLL), control ActiveX, executabil DOS sau mod text, bibliotecă statică sau aplicaţie consolă. Unele dintre acestea pot fi disponibile atât în versiunea pe 16 biţi cât şi în cea pe 32 de biţi.
Deoarece programele din această carte sunt generale, ar trebui să evitaţi opţiunile care necesită un cod specific unei anumite platforme, cum ar fi aplicaţiile Windows. Mai bine, alegeţi modul text. Alegerea va depinde de compilator. Unele versiuni Microsoft conţin o opţiune QuickWin care emulează o sesiune DOS; alte versiuni conţin o opţiune Console (consolă. Unele versiuni Borland prezintă o opţiune EasyWin care emulează o sesiune DOS, alte versiuni oferă opţiunea Console. Compilatoarele Metrowerks oferă o versiune Console. În general, căutaţi o opţiune numită Console, character-mode (mod text) sau DOS executable (executabil DOS) şi încercaţi-o.
După ce aţi configurat proiectul, va trebui să compilaţi şi să legaţi programul dumneavoastră. De obicei, IDE vă va oferi mai multe opţiuni, cum ar fi Compile, Build, Make, Build All, Link, Execute şi Run (toate aceste opţiuni nu există neapărat în cadrul aceluiaşi IDE!).
•    Opţiunea Compile, de obicei compilează codul fişierului activ.
•    Opţiunea Build sau opţiunea Make compilează, de obicei, toate fişierele sursă ale proiectului. În general, acesta este un proces incremental. Adică, în cazul în care proiectul are trei fişiere şi modificaţi numai unul dintre ele, acesta va fi singurul care va fi recompilat.
•    Opţiunea Build All, recompilează de obicei toate fişierele sursă.
•    Opţiunea Link (după cum am descris anterior) combină, de obicei, codul sursă compilat cu bibliotecile necesare.
•    Opţiunea Run sau opţiunea Execute rulează programul. De obicei, dacă nu aţi parcurs paşii anteriori, înainte de a încerca rularea programului, opţiunea Run va efectua în mod automat aceşti paşi.
Un compilator generează un mesaj de eroare atunci când nu respectaţi o regulă de sintaxă şi identifică linia în care este situată aceasta. Din păcate, atunci când sunteţi începător într-un limbaj de programare, este posibil să întâmpinaţi dificultăţi în înţelegerea mesajului. Uneori, eroarea adevărată poate apărea înaintea liniei identificate, iar câteodată, o singură eroare va genera un lanţ de mesaje de eroare.

Sugestie
În rezolvarea erorilor începeţi întotdeauna cu prima eroare depistată. Dacă nu o găsiţi în linia identificată verificaţi linia anterioară.

Sugestie
Ocazional, compilatoarele se pot zăpăci după o construire incompletă a unui program şi drept urmare pot afişa mesaje de eroare fără sens, care nu pot fi rezolvate. În asemenea situaţii puteţi clarifica lucrurile selectând opţiunea Build All pentru a relua întregul proces. Din păcate, este dificil să faceţi distincţie între această situaţie şi una mai obişnuită în care mesajele de eroare par să nu aibă nici un înţeles.

De obicei, IDE vă permite să rulaţi programul într-o fereastră auxiliară. Unele IDE-uri închid fereastra chiar în momentul terminării execuţiei, altele o lasă deschisă. În cazul în care compilatorul dumneavoastră închide fereastra, dacă nu aveţi o privire ageră sau o memorie fotografică atunci nu vă va fi uşor să vedeţi rezultatul. Pentru a citi ieşirea, la sfârşitul programului trebuie să plasaţi un cod adiţional:
    cin.get();    // adaugati aceasta instructiune
    cin.get();    // poate si pe aceasta
    return 0;
}
Instrucţiunea cin.get() citeşte tasta acţionată, deci această instrucţiune va pune programul în aşteptare, până la acţionarea tastei Enter. (Nici o acţionare de tastă nu va fi transmisă programului până la acţionarea tastei Enter, deci acţionarea unei alte taste nu are sens.) De cea de a doua instrucţiune este nevoie în cazul în care programul, după o tastare obişnuită nu ar procesa această acţiune. De exemplu, dacă introduceţi un număr şi apoi acţionaţi tasta Enter. Programul va citi acest număr, dar acţionarea tastei Enter va rămâne neprocesată şi va fi citită doar la prima instrucţiune cin.get().
Compilatorul Borland C++ Builder diferă puţin de proiectările mai tradiţionale. Scopul său principal este programarea Windows. Pentru a-l utiliza în crearea de programe generale, selectaţi din meniul File opţiunea New şi apoi alegeţi Console App. Se va deschide o fereastră care va conţine o versiune schelet a funcţiei main(). Din aceasta puteţi şterge anumite elemente, dar ar trebui să păstraţi următoarele două linii non-standard:
#include <vclcondefs.h>
#pragma hdrstop

Compilatoare Macintosh
Cele două compilatoare Macintosh C++ cele mai cunoscute sunt Metrowerks Code Warrior şi compilatorul pentru Macintosh Symantec C++. Ambele furnizează IDE-uri similare bazate pe proiecte, adică într-o concepţie elementară, ceea ce veţi găsi într-un compilator Windows. (Într-adevăr, ambele companii oferă versiuni pentru Windows ale compilatoarelor lor.) În ambele produse începeţi cu selectarea din meniul File a opţiunii New Project. Veţi putea alege dintre mai multe tipuri de proiecte. Pentru Code Warrior, în versiunile mai vechi alegeţi MacOS:C/C++:ANSI C++ Console, iar în versiunile mai recente, MacOS:C/C++:Standard Console:Std C++ Console; pentru Symantec alegeţi ANSII C++ (Iostreams). De asemenea, puteţi alege versiunea 68K (pentru seria de procesoare Motorola 680X0) sau versiunea PPC (pentru procesoare PowerPC).
Ambele produse conţin ca parte a proiectului iniţial, un mic fişier sursă. Pentru a vedea dacă sistemul dumneavoastră este configurat corect, puteţi încerca să compilaţi şi să rulaţi acest program. Totuşi, odată ce furnizaţi propriul dumneavoastră cod ar trebui să ştergeţi acest fişier din proiect. Acest lucru îl realizaţi selectând fişierul în fereastra proiectului şi apoi selectând din meniul Project opţiunea Remove.
În continuare, trebuie să adăugaţi la proiect codul sursă al dumneavoastră. Din meniul File puteţi alege opţiunea New pentru a crea un nou fişier sau puteţi alege opţiunea Open pentru a deschide un fişier existent. Utilizaţi sufixele potrivite, cum ar fi .cp sau .cpp. Pentru a adăuga acest fişier la lista proiectului utilizaţi meniul Project. Unele programe din această carte necesită adăugarea mai multor fişiere sursă. După ce aţi terminat, din meniul Project alegeţi opţiunea Run.

Sugestie
Pentru a economisi timp puteţi utiliza un singur proiect pentru toate programele exemplu. Ştergeţi din lista proiectului fişierul sursă al exemplului anterior şi adăugaţi codul sursă curent. Aceasta va economisi spaţiu pe hard-disc.

Ambele compilatoare conţin depanatoare pentru a vă ajuta la localizarea problemelor apărute în timpul execuţiei.

Convenţii utilizate în această carte
Pentru a ajuta distingerea diferitelor tipuri de text, am utilizat câteva convenţii tipografice. Tipul cursiv este utilizat pentru cuvinte importante sau fraze folosite pentru prima dată, cum ar fi programare structurată. Tipul monospaţial poate reprezenta oricare dintre următoarele:
•    Nume sau valori utilizate într-un program, cum ar fi x, racheta sau 3.14
•    Cuvinte cheie ale limbajului, cum ar fi int sau if else
•    Nume de fişiere, cum ar fi iostream
•    Funcţii, cum ar fi main() sau puts()
Un cod sursă C++ este prezentat astfel:
#include <iostream>
using namespace std;
int main()
{
cout << “Ce se intampla, doctore!n”;
return 0;
}
Rezultatele obţinute la rularea unui program utilizează acelaşi format, excepţie făcând informaţiile introduse de către utilizator, care apar cu aldine:
Va rog sa introduceti numele dumneavoastra:
Platon
Deoarece în această carte este vorba de programarea orientată spre obiecte, pentru a vă ajuta la identificarea diverselor elemente ale cărţii, am utilizat obiecte geometrice. Sugestiile, regulile şi notele sunt marcate prin becuri, gesturi şi creioane.
O regulă ocazională sau o sugestie o veţi găsi în următorul format:

Sugestie
Veţi învăţa lucrând, deci încercaţi exemplele şi experimentaţi cu ele.

Apropo, tocmai aţi citit o sugestie reală şi importantă şi nu numai un exemplu asupra aspectului unei reguli sau a unei sugestii.
În încheiere, atunci când introduceţi date într-un program, pentru a trimite programului o anumită intrare, trebuie în mod normal să acţionaţi tasta Return sau tasta Enter. Unele tastaturi utilizează una dintre ele iar altele pe cealaltă; în această carte este folosită tasta Enter.

Sistemul de calcul utilizat
Această carte descrie definiţiile proiectului ISO/ANSI CD2 ale C++, care în mod esenţial este identic cu standardul final dezbătut în această carte, deci exemplele ar trebui să funcţioneze pe orice implementare C++ compatibilă cu acest standard. (Cel puţin, aceasta este viziunea şi speranţa portabilităţii.) Totuşi, standardul C++ este încă nou şi este posibil să găsiţi câteva discrepanţe. De exemplu, în momentul scrierii acestei cărţi, multe compilatoare C++ nu cunoşteau zonele de nume sau noile caracteristici şablon. Suportul pentru biblioteca de şabloane standard (Standard Template Library) descris în Capitolul 15 era insignifiant în momentul scrierii acestei cărţi. Sistemele care utilizează versiunea 2.0 (sau mai nouă a translatorului cfront, pot trimite codul tradus unui compilator C care nu este pe deplin compatibil ANSI, având ca rezultat faptul că unele caracteristici ale limbajului au rămas neimplementate, iar unele funcţii din bibliotecile standard ANSI şi unele fişiere antet nu sunt suportate. De asemenea, unele lucruri cum ar fi numărul de octeţi utilizat pentru a înmagazina un întreg sunt dependente de implementare.
Pentru informarea dumneavoastră, exemplele din această carte au fost elaborate utilizând Microsoft Visual C++ 5.0 şi Metrowerks Code Warrior Professional Release 2, pe un calculator Pentium cu un hard-disc pe care rula sistemul de operare Windows 95. Programele au fost verificate cu GNU g++ 2.7.1, pe un calculator compatibil IBM 486 pe care rula Linux, cu Watcom 10.6 pe un calculator Pentium şi cu Metrowerks CodeWarrior Professional Release 2 pe un Macintosh G3 pe care rula System 8.0. Cartea raportează discrepanţe privind folosirea unui standard mai vechi, de exemplu, „implementările mai vechi folosesc ios::fixed în loc de ios_base::fixed”. Cartea raportează unele bug-uri (N.T.: Mai bine bug decât hibă.) şi idiosincrasii care vă pot deruta; totuşi, acestea aproape sigur vor fi rezolvate în versiunile următoare.


_______________________________________
Viata e un chin etern
cand esti zi de zi
propriu tau subaltern :d

 
   
Pagini: 1  
Mergi la