This is an old revision of the document!
Articol 02 - Noțiuni de C++
Obiective
În urma parcurgerii acestui laborator studentul va:
înțelege conceptul de template
înțelege conceptul de referințe din C++
înțelege conceptul de read-only introdus prin identificatorul const
Constructori și destructori
Studiați codul de mai jos.
- complex.h
class Complex {
public:
// Constructor
Complex(double re, double im);
// Destructor
~Complex();
double getRe();
double getIm();
Complex conjugate();
private:
double re;
double im;
};
|
- complex.cc
#include "complex.h"
Complex::Complex(double re, double im) {
this->re = re;
this->im = im;
}
Complex::~Complex() {
}
Complex Complex::conjugate() {
Complex conjugat(re, -im);
return conjugat;
}
double Complex::getRe() {
return re;
}
double Complex::getIm() {
return im;
}
|
- main.cc
#include <stdio.h>
#include "complex.h"
int main() {
Complex number(2, 3);
printf("%lf %lf\n", number.getRe(), number.getIm());
return 0;
}
Constructor
Observăm două bucăți din cod în mod special:
Complex::Complex(double re, double im);
Linia de mai sus nu are tip returnat, spre deosebire de celelalte linii.
Acesta este constructorul clasei, care este apelat în momentul alocării unui obiect.
Ce operații sunt uzuale în constructor?
A doua bucată observată este:
Complex numar(2, 3);
Până acum nu ați mai alocat astfel structurile. Ce se întâmplă în spate este exact ceea ce intuiți: este apelat constructorul obiectului și se execută instrucțiunile acestuia pentru variabila numar (reprezentată ca pointer prin this, direct în interiorul constructorului).
În constructorul definit mai sus, tot ceea ce se întâmplă este să se inițializeze membri. Pentru asta, C++ vă pune la dispoziție o sintaxă simplă:
Complex::Complex(double real, double imaginar) :
re(real),
im(imaginar) {
}
Cei doi constructori sunt identici ca funcționalitate.
Destructor
Așa cum probabil ați observat, constructorul este apelat în mod explicit de către voi. Destructorul însă, în cazul de mai sus, este apelat implicit la terminarea blocului care realizează dealocărea automată a obiectului.
Un destructor nu are parametri și se declară în interiorul clasei astfel:
~Complex();
Dacă în constructor sau în interiorul clasei ați fi alocat memorie, cel mai probabil în destructor ați fi făcut curat și ați fi apelat free pe membrul respectiv.
[3p] Simple use of const
[0.5p] Creati un pointer variabil la o variabila de tip intreg constanta (in 2 moduri).
[0.5p] Creati un pointer constant la o variabila de tip intreg non-constanta.
[0.5p] Creati un pointer constant la o variabila de tip intreg constanta.
[1.5p] Initializati pointerul si variabila referita pentru fiecare caz. Explicati si rezolvati erorile de compilare.
[5p] Clasa MappingEntry - conține 2 membri de tipuri potențial diferite și realizează, din punct de vedere conceptual, asocierea între două valori (una se numește cheie, iar cealaltă valoare).
[2p] Implementați și folosiți utilizând template-uri clasa MappingEntry de mai sus adăugând constructor și destructor.
[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.
Bibliografie