This shows you the differences between two versions of the page.
sd-ca:laboratoare:laborator-02 [2016/02/21 19:46] radu.stochitoiu |
sd-ca:laboratoare:laborator-02 [2016/02/21 19:51] (current) radu.stochitoiu |
||
---|---|---|---|
Line 3: | Line 3: | ||
===== Obiective ===== | ===== Obiective ===== | ||
- | În urma parcurgerii acestui laborator studentul va: | + | În urma parcurgerii acestui articol studentul va: |
- | * înțelege conceptul de template | + | * învăța ce înseamnă o clasă |
- | *Învățăm ce înseamnă constructor / destructor | + | * învăța ce înseamnă constructor / destructor |
+ | * afla funcționalitățile claselor / funcțiilor prietene | ||
+ | * realiza supraîncărcarea operatorilor din C++ | ||
+ | * înțelege conceptul de copy constructor | ||
+ | * înțelege conceptul de rule of three | ||
+ | |||
+ | |||
+ | |||
+ | ==== 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> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== 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> | ||
==== Constructori și destructori ==== | ==== Constructori și destructori ==== | ||
Line 199: | Line 294: | ||
===== Clase/metode prietene ===== | ===== Clase/metode prietene ===== | ||
- | Așa cum am văzut în primul laborator, fiecare membru al clasei poate avea 3 specificatori de acces: | + | Așa cum am văzut în primul articol, fiecare membru al clasei poate avea 3 specificatori de acces: |
* public | * public | ||
* private | * private | ||
Line 479: | Line 574: | ||
*[**2p**] Setati tipul de return a metodelor de tip getter astfel incat sa puteti modifica valorea intoarsa. | *[**2p**] Setati tipul de return a metodelor de tip getter astfel incat sa puteti modifica valorea intoarsa. | ||
*[**1p**] Arătați funcționalitatea prin adăugarea de cod în fișierul main.cpp. Rezolvați, dacă e cazul, toate erorile/leak-urile depistate de Valgrind. | *[**1p**] Arătați funcționalitatea prin adăugarea de cod în fișierul main.cpp. Rezolvați, dacă e cazul, toate erorile/leak-urile depistate de Valgrind. | ||
- | </hidden> | ||
*[**5p**] Clasa Complex - clasă ce implementează conceptul de număr complex | *[**5p**] Clasa Complex - clasă ce implementează conceptul de număr complex | ||
Line 496: | Line 590: | ||
*[**2p**] Alocați o instanță de tip MappingEntry local și dinamic (utilizând new / delete). | *[**2p**] Alocați o instanță de tip MappingEntry local și dinamic (utilizând new / delete). | ||
*[**1p**] Arătați funcționalitatea prin adăugarea de cod în fișierul main.cpp. Rezolvați, dacă e cazul, toate erorile/leak-urile depistate de Valgrind. | *[**1p**] Arătați funcționalitatea prin adăugarea de cod în fișierul main.cpp. Rezolvați, dacă e cazul, toate erorile/leak-urile depistate de Valgrind. | ||
- | <hidden> | + | |
*[**5p**] Clasa Punct2D - clasă ce implementează conceptul de punct în plan | *[**5p**] Clasa Punct2D - clasă ce implementează conceptul de punct în plan | ||
*[**2p**] Implementați și folosiți utilizând template-uri clasa Punct2D, adăugând constructor și destructor. | *[**2p**] Implementați și folosiți utilizând template-uri clasa Punct2D, adăugând constructor și destructor. | ||
Line 507: | Line 601: | ||
- | </hidden> | + | |
*[**5p**] Clasa Punct2D - clasă ce implementează conceptul de punct în plan | *[**5p**] Clasa Punct2D - clasă ce implementează conceptul de punct în plan | ||
Line 524: | Line 618: | ||
*[**1p**] Arătați funcționalitatea prin adăugarea de cod în fișierul main.cpp. Rezolvați, dacă e cazul, toate erorile/leak-urile depistate de Valgrind. | *[**1p**] Arătați funcționalitatea prin adăugarea de cod în fișierul main.cpp. Rezolvați, dacă e cazul, toate erorile/leak-urile depistate de Valgrind. | ||
- | <hidden> | + | |
===== Interviu ===== | ===== Interviu ===== | ||
- | Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship, part-time, full-time, etc.) din materia prezentată în cadrul laboratorului. | + | Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship, part-time, full-time, etc.) din materia prezentată în cadrul articolului. |
* Care este diferența între struct și class în C++? | * Care este diferența între struct și class în C++? |