This shows you the differences between two versions of the page.
|
sd-ca:laboratoare:laborator-02 [2016/02/21 19:39] 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ă |
| - | * înțelege conceptul de referințe din C++ | + | * învăța ce înseamnă constructor / destructor |
| - | * înțelege conceptul de read-only introdus prin identificatorul const | + | * 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 | ||
| - | *Învățăm ce înseamnă constructor / destructor | + | |
| + | |||
| + | ==== 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 202: | 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 482: | 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 499: | 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 510: | 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 527: | 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++? | ||