This shows you the differences between two versions of the page.
|
sd-ca:laboratoare:laborator-01 [2016/02/21 19:42] radu.stochitoiu |
sd-ca:laboratoare:laborator-01 [2016/02/21 19:49] (current) radu.stochitoiu |
||
|---|---|---|---|
| Line 3: | Line 3: | ||
| În cadrul acestui articol ne propunem să ilustrăm conceptele din C++ cu care veți lucra pe parcursul acestui semestru. | În cadrul acestui articol ne propunem să ilustrăm conceptele din C++ cu care veți lucra pe parcursul acestui semestru. | ||
| - | Într-un mod extrem de simplist spus C++ este un superset al limbajului C, iar tot ceea ce ați învățat în C la [[http://ocw.cs.pub.ro/courses/programare-ca| PC]] se poate compila cu un compilator pentru limbajul C++, funcționalitatea rămânând aceeași. | + | Într-un mod extrem de simplist spus C++ este un superset al limbajului C, iar tot ceea ce ați învățat în C la [[http://ocw.cs.pub.ro/courses/programare| PC]] se poate compila cu un compilator pentru limbajul C++, funcționalitatea rămânând aceeași. |
| ===== Obiective ===== | ===== Obiective ===== | ||
| Line 11: | Line 11: | ||
| * înțelege conceptul de referințe din C++ | * înțelege conceptul de referințe din C++ | ||
| * înțelege conceptul de read-only introdus prin identificatorul const | * înțelege conceptul de read-only introdus prin identificatorul const | ||
| - | |||
| *Înțelegem ce presupune definirea unei clase | *Înțelegem ce presupune definirea unei clase | ||
| ===== De ce C++? ===== | ===== De ce C++? ===== | ||
| Line 17: | Line 16: | ||
| ===== Sintaxa C++ ===== | ===== Sintaxa C++ ===== | ||
| - | |||
| - | ==== De la structuri C la clase C++ ==== | ||
| ==== Definirea structurii ==== | ==== Definirea structurii ==== | ||
| - | În cadrul laboratorului de Programarea Calculatoarelor am învățat să declarăm și să folosim tipuri de date complexe, [[http://ocw.cs.pub.ro/courses/programare-ca/laboratoare/lab10 | structuri]] în limbajul C. Pentru a recapitula, iată mai jos un exemplu simplu de astfel de structură, pentru a reprezenta un număr complex. | + | În cadrul laboratorului de Programarea Calculatoarelor am învățat să declarăm și să folosim tipuri de date complexe, [[http://ocw.cs.pub.ro/courses/programare/laboratoare/lab10| structuri]] în limbajul C. Pentru a recapitula, iată mai jos un exemplu simplu de astfel de structură, pentru a reprezenta un număr complex. |
| <columns 400px 100% -> | <columns 400px 100% -> | ||
| Line 167: | Line 164: | ||
| return 0; | return 0; | ||
| } | } | ||
| - | </code> | ||
| - | |||
| - | ==== Clase ==== | ||
| - | |||
| - | Formal am făcut deja primii pași mai sus pentru a implementa o clasă în C++, utilizând keyword-ul //struct//. | ||
| - | |||
| - | Totuși, ce înseamnă o clasă? Nu trebuie decât să ne gândim la ce am făcut mai sus: | ||
| - | *am definit un tip de date | ||
| - | *i-am adăugat atribute (am definit ce proprietăți îl caracterizează: partea reală și partea imaginară) | ||
| - | *i-am adăugat metode (am definit cum se comportă: inițializarea și conjugarea) | ||
| - | |||
| - | Cu această adăugare menționată, putem să ne referim la ceea ce înseamnă o **clasă**, respectiv un **obiect**. | ||
| - | |||
| - | Ne referim la o **clasă** ca fiind o amprentă (blueprint) sau descriere generală. | ||
| - | Un **obiect** sau o **instanță a clasei** este o variabilă concretă ce se conformează descrierii clasei. | ||
| - | |||
| - | Vom numi **clasă** tipul de date definit de //struct complex// sau //class complex// și **obiect** o instanțiere (o alocare dinamică sau locală) a tipului de date. | ||
| - | |||
| - | Când discutăm despre tipul de date //complex// ne referim la clasă. | ||
| - | Când discutăm despre variabila //number// ne referim la un obiect, o instanță a clasei. | ||
| - | |||
| - | ==== Keyword-ul "class" vs. "struct" ==== | ||
| - | |||
| - | Și totuși, C++ adăugă keyword-ul //class//. Care este diferența între //class// și //struct//? | ||
| - | Iată cum definim complet clasa de mai sus, separând antetul de implementare și de programul principal. | ||
| - | |||
| - | <columns 100% 100% -> | ||
| - | <code c++ complex.h> | ||
| - | class Complex { | ||
| - | double re; | ||
| - | double im; | ||
| - | | ||
| - | Complex conjugate(); | ||
| - | }; | ||
| - | </code> | ||
| - | |||
| - | <newcolumn> | ||
| - | |||
| - | <code c++ complex.cc> | ||
| - | #include "complex.h" | ||
| - | Complex Complex::conjugate() { | ||
| - | Complex conjugate; | ||
| - | conjugate.re = this->re; | ||
| - | conjugate.im = -(this->im); | ||
| - | | ||
| - | return conjugate; | ||
| - | } | ||
| - | </code> | ||
| - | |||
| - | <newcolumn> | ||
| - | |||
| - | <code c++ main.cc> | ||
| - | #include <stdio.h> | ||
| - | #include "complex.h" | ||
| - | |||
| - | int main() { | ||
| - | Complex number; | ||
| - | number.re = 2; | ||
| - | number.im = 4; | ||
| - | | ||
| - | printf("%.2lf %.2lf\n", number.re, number.im); | ||
| - | | ||
| - | return 0; | ||
| - | } | ||
| - | </code> | ||
| - | </columns> | ||
| - | |||
| - | |||
| - | ====Compilare==== | ||
| - | |||
| - | Sursele C++ se compilează folosind compilatorul **g++**. Acesta permite exact aceleași opțiuni de bază ca și **gcc**, compilatorul utilizat pentru sursele de C. | ||
| - | |||
| - | * Încercați să compilați și să rulați codul din cele 3 fișiere de mai sus. | ||
| - | |||
| - | <code bash> | ||
| - | g++ complex.cc main.cc -o exemplu | ||
| - | </code> | ||
| - | Ce observați? | ||
| - | |||
| - | Înlocuiți acum keyword-ul //class// cu keyword-ul //struct// și compilați din nou. | ||
| - | |||
| - | ==== Specificatori de acces ==== | ||
| - | Am observat mesajul de eroare în urma compilării fișierelor de mai sus. | ||
| - | |||
| - | Astfel, **singura diferență** folosirea celor două keyword-uri este nivelul implicit de vizibilitate a metodelor și atributelor. | ||
| - | ***private** - pentru clasele declarate cu **class** | ||
| - | ***public** - pentru clasele declarate cu **struct** | ||
| - | |||
| - | Membri precedați de label-ul **private** pot fi folosiți numai în interiorul clasei, în cadrul metodelor acesteia. | ||
| - | Ei nu pot fi citiți sau modificați din afara clasei. | ||
| - | |||
| - | Iată cum puteam remedia soluția: | ||
| - | <code c++ complex.h> | ||
| - | class Complex { | ||
| - | public: | ||
| - | double re; | ||
| - | double im; | ||
| - | |||
| - | Complex conjugate(); | ||
| - | }; | ||
| </code> | </code> | ||
| Line 432: | Line 329: | ||
| Codul de mai sus returnează o referință către membrul ''re'' al obiectului ''Complex z'', așadar orice atribuire efectuată asupra acestui câmp va fi vizibilă și în obiect. | Codul de mai sus returnează o referință către membrul ''re'' al obiectului ''Complex z'', așadar orice atribuire efectuată asupra acestui câmp va fi vizibilă și în obiect. | ||
| + | |||
| + | ====Compilare==== | ||
| + | |||
| + | Sursele C++ se compilează folosind compilatorul **g++**. Acesta permite exact aceleași opțiuni de bază ca și **gcc**, compilatorul utilizat pentru sursele de C. | ||
| + | |||
| + | * Încercați să compilați și să rulați codul din cele 3 fișiere de mai sus. | ||
| + | |||
| + | <code bash> | ||
| + | g++ complex.cc main.cc -o exemplu | ||
| + | </code> | ||
| + | Ce observați? | ||
| + | |||
| + | Înlocuiți acum keyword-ul //class// cu keyword-ul //struct// și compilați din nou. | ||
| <hidden> | <hidden> | ||