Sunteți pe pagina 1din 13

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică şi Microelectronică


Departamentul Ingineria Software și Automatică

Disciplina: Programarea Orientată pe Obiecte

RAPORT
Lucrarea de laborator nr.2
Tema: ” Constructorul – funcţie de iniţializare a obiectelor
clasei”

A efectuat studentul: Corcodel Marius

A controlat: Lisnic Inga, lector universitar, DISA

Chișinău 2021
Scopul lucrării:

• Studierea principiilor de definire şi utilizare a constructorilor


• Studierea principiilor de definire şi utilizare a destructorilor
• Studierea tipurilor de constructori
#include <iostream>
#include <string.h>

using namespace std;

class Document
{
char *denumirea;
char *tema;
char *autorul;
int nrPagini;
char *data;
char *timpul;

public:
Document();
Document(const Document &);
Document(char *denumirea);
void creare();
void afisare();
void modificareTema();
void modificareData();
};

Document::Document() : denumirea(NULL), tema(NULL), autorul(NULL), nrPagini(0),


data(NULL), timpul(NULL){};

void Document::creare()
{
denumirea = new char[21];
tema = new char[21];
autorul = new char[21];
data = new char[21];
timpul = new char[21];
cout << "Introduceti denumirea documentului: ";
cin >> denumirea;
cout << "Introduceti tema: ";
cin >> tema;
cout << "Introduceti autorul: ";
cin >> autorul;
cout << "Introduceti numarul de pagini: ";
cin >> nrPagini;
cout << "Introduceti data ultimii redactari: ";
cin >> data;
cout << "Introduceti timpul ultimii redactari: ";
cin >> timpul;
}

void Document::modificareTema()
{
cout << "Introduceti tema noua: ";
cin >> tema;
}

void Document::modificareData()
{
cout << "Introduceti data noua: ";
cin >> data;
}

void Document::afisare()
{
cout << "\nDenumirea documentului: " << denumirea << endl;
cout << "Tema documentului: " << tema << endl;
cout << "Autorul: " << autorul << endl;
cout << "Numarul de pagini: " << nrPagini << endl;
cout << "Data ultimii redactari: " << data << endl;
cout << "Timpul ultimii redactari: " << timpul << endl;
}

int main()
{
int nrDeDocumente, temp;
cout << "Introduceti numarul de documente: ";
cin >> nrDeDocumente;
Document doc[8];
for (int i = 0; i < nrDeDocumente; i++)
{
doc[i].creare();
}
for (int i = 0; i < nrDeDocumente; i++)
{
cout << "\n"
<< i + 1 << endl;
doc[i].afisare();
}
cout << "Introduceti numarul de ordine a documentului spre schimbare: ";
cin >> temp;
doc[temp - 1].modificareTema();
cout << "Introduceti numarul de ordine a documentului spre schimbare: ";
cin >> temp;
doc[temp - 1].modificareData();
for (int i = 0; i < nrDeDocumente; i++)
{
cout << "\n"
<< i + 1 << endl;
doc[i].afisare();
}
system("pause");
}
#include <iostream>

using namespace std;

class Matrix
{
public:
int Tab[50][50];
int line;
int column;

Matrix();
Matrix(int);
Matrix(int, int);
Matrix(const Matrix &);
~Matrix();

void f_set_matr();
void f_show();
void f_addition(const Matrix &matrix);
void f_subtract(const Matrix &matrix);
void f_multipl_matrix(const Matrix &matrix);
void f_multipl_num(int value);
};

int g_size;

Matrix::Matrix() : line(0), column(0) {}

Matrix::Matrix(int line, int column) : line(line), column(column)


{
int i, j;

for (i = 0; i < line; i++)


for (j = 0; j < column; j++)
Tab[i][j] = 0;
}

Matrix::Matrix(const Matrix &Tab2) : line(Tab2.line), column(Tab2.column)


{
int i, j;
for (i = 0; i < line; i++)
for (j = 0; j < column; j++)
Tab[i][j] = Tab2.Tab[i][j];
}

Matrix::~Matrix()
{
int i;

for (i = 0; i < line; ++i)


delete[] Tab;
line = 0;
column = 0;
}

void Matrix::f_set_matr()
{
int i, j;
for (i = 0; i < line; i++)
for (j = 0; j < column; j++)
{
cout << " Coordonata[" << i << "][" << j << "]=";
cin >> Tab[i][j];
}
}

void Matrix::f_show()
{
int i, j;

for (i = 0; i < line; i++)


{
for (j = 0; j < column; j++)
cout << "\t" << Tab[i][j] << "\t";
cout << endl;
}
}

void Matrix::f_addition(const Matrix &matrix)


{
Matrix matr;
int i, j;

for (i = 0; i < line; i++)


for (j = 0; j < column; j++)
Tab[i][j] += matrix.Tab[i][j];
}

void Matrix::f_subtract(const Matrix &matrix)


{
int i, j;

for (i = 0; i < line; i++)


for (j = 0; j < column; j++)
Tab[i][j] -= matrix.Tab[i][j];
}

void Matrix::f_multipl_matrix(const Matrix &matrix)


{
int i, j, k;
int temp = 0;
int Tab2[50][50];

if (column == matrix.line)
{
for (i = 0; i < line; i++)
{
for (j = 0; j < column; j++)
{
for (k = 0; k < line; k++)
{
temp += Tab[i][k] * matrix.Tab[k][j];
Tab2[i][j] = temp;
}
temp = 0;
}
temp = 0;
}
for (i = 0; i < line; i++)
for (j = 0; j < column; j++)
Tab[i][j] = Tab2[i][j];
}
else
cout << "Matricile nu pot fi inmultine din cauza dimensiunilor" << endl;
}

void Matrix::f_multipl_num(int value)


{
int i, j;

for (i = 0; i < line; i++)


for (j = 0; j < column; j++)
Tab[i][j] *= value;
}

void f_menu()
{
Matrix m1, m2;
int ml_nr;

cout << "Prima matrice\n"


<< endl;
cout << "Numarul de linii = ";
cin >> m1.line;
cout << "Numarul de coloane = ";
cin >> m1.column;
Matrix matrix1(m1.line, m1.column);
matrix1.f_set_matr();

cout << "\tA doua matrice\n"


<< endl;
cout << "Numarul de linii = ";
cin >> m2.line;
cout << "Numarul de coloane = ";
cin >> m2.column;
Matrix matrix2(m2.line, m2.column);
matrix2.f_set_matr();

cout << "Prima matrice:" << endl;


matrix1.f_show();
cout << "\nA doua matrice:" << endl;
matrix2.f_show();

Matrix matrix3 = matrix1;


Matrix matrix4 = matrix1;
Matrix matrix5 = matrix1;

cout << "\nAdunarea:" << endl;


matrix1.f_addition(matrix2);
matrix1.f_show();

cout << "\nScaderea:" << endl;


matrix4.f_subtract(matrix2);
matrix4.f_show();

cout << "\nInmultirea:\n"


<< endl;
matrix5.f_multipl_matrix(matrix2);
matrix5.f_show();

cout << "\nInmultirea matricei cu un numar:" << endl;


cout << "Numarul:";
cin >> ml_nr;
cout << endl;
matrix3.f_multipl_num(ml_nr);
matrix3.f_show();

exit(0);
}

int main()
{
f_menu();
return (0);
}
Explicati termenul de initializare – Crearea unui obiect de tipul clasei
Ce cuvinte cheie se utilizeaza pentru definire constructorului sau destructorului? – se
utilizeaza cu acelasi nume ca al clasei , la destructor este precedat de “~”.
Poate oare un constructor sa returneze o valoare? - nu , nici chiar void
Poate oare sa exista clase fara constructori? – nu , daca programatoru-l nu de clara
constructorul si constructorul de coipiere este creat automat de catre compilator.
Citi constructori poate contine o clasa? Dar destructori? De ce? – Clasa poate sa contina un
numar nenumarat de constructori , in dependenta de caz . Dar destructorul poate fi numai unul
pentru ca el nu are paramaetri deci nu poate fi supraincarcat , si este unic pentru o clasa.

Enumarati tipurile de constructori .


a) Constructor fara parametri ( sau constructor implicit)
b) Constructor cu parametri
a. Constructor general (care initializeaza toate cimpurile)
b. Constructori cu un anumit numar de parametri
c) Constructor de copiere( este un constructor care creeaza un obiect null prin cloanrea unei
instante deja existente)
d) Constructor de schimabare a tipului ( este un constructor care primeste un tip de date
strain pentru clasa respectiva si il converteste in obiect de tipul dat )
Cum se apeleaza un constructor – constructorul se noteaza ca o functie cu numele clasei cu
sau fara parametri.
De ce este nevoie de definit un constructor de copiere? - Pentru ca putem avea scurgeri de
memorie atunci cind alocam dinamic memoria si p/u ca constructorul generat automat implica
copierea bit cu bit ceea ce nu intotdeauna este satisfacator.
De ce este nevoie de definit un constructor de conversie a tipului? Pentru convertirea mai
comoda a tipului de date.
In ce cazuri se foloseste constructorul de copiere ,care este sintaxa apelului? – Constructorul
de copiere se foloseste in urmatoarel cazuri:
- Initializarea unui obiect din altul de acelasi tip
- Copierea unui obiect p/u transmiterea lui ca a argument a unei functii
- Copierea unui obiect p/u returnarea lui din corpul unei functii
<numele clasei>(const <numele clsei> &<obiect>){ ... }
Ce sunt listele de initializare(initializatorii)? - mecanism folosit in constuctori care contribuie
la evitarea cheltuielii necesare pentru initializarea cimpurilor .
In care caz se defineste obligatoriu constructorul implicit? - in cazul utilizării tabloului de
obiecte se defineşte în mod obligatoriu un constructor implicit, care se apelează pentru
iniţializarea elementelor tabloului.

Concluzie:
În urma efectuării lucrării de laborator am efectuat 2 programe utilizând clasele. În
primul program am creat o clasă cu denumirea Document creând 5 variabile utilizând memoria
dinamică și o variabilă de tip int. Am definit toți constructorii. Am creat deasemenea 2 funcții de
modificare a temei și respectiv a datei ultimei redactări.
În al doilea program am creat o clasă cu denumirea Matrice care are funcții ce execută adunarea
și scăderea a matricilor, înmulțirea celor 2 matrici între ele și înmulțirea a unei matrici cu un
număr.

S-ar putea să vă placă și