Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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>​
sd-ca/laboratoare/laborator-01.1456076575.txt.gz · Last modified: 2016/02/21 19:42 by radu.stochitoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0