Sunteți pe pagina 1din 11

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Catedra Automatica si Tehnologii Informationale
Specialitatea Ingineria Sistemelor Biomedicale

REFERAT
La Lucrare de laborator nr.3
la disciplina: Programarea in limbajul C++
Tema: Supraincarcarea operatorilor

A efectuat:

st. gr. ISBM-131


Moroi Ion

A verificat:

lector asistent

Balan M.

Chiinu 2014

1 Scopul si sarcina lucrrii


1.1 Scopul lucrrii:
studierea necesitii suprancrcrii operatorilor;
studierea sintaxei de definire a operatorilor;
studierea tipurilor de operatori;
studierea formelor de suprancrcare.
1.2 Sarcina lucrrii:
S se creeze clasa 3-D de coordonate n spaiu. S se defineasc operatorii
"+", "-", "=", ca metode ale clasei, iar operatorii de comparare ca funcii
prietene. De prevzut posibilitatea realizrii de operaii att ntre coordonate ct i
ntre coordonate i numere obinuite.
2 Indicaii teoretice
Prin suprancrcarea unui operator se nelege c acesta este utilizat n
contexte diferite, avnd aceeai semnificaie sau o semnificaie diferit. Astfel
operatorul + este suprancrcat pentru adunarea ntregilor i a realilor;
operatorul << este suprancrcat cu semnificaia de deplasare la stnga, dac
termenii sunt ntregi sau inserare n flux, dac un termen este un flux de date, iar
cellalt un obiect.
Programatorul poate asocia noi semnificaii operatorilor existeni prin
suprancrcarea operatorilor. Anumii operatori pot fi utilizai cu orice tip de
termeni (sunt deja suprancrcai global de ctre compilator). Acetia sunt: new,
delete, sizeof, ::, =, &, ->*, .*, ., ->.
Pot fi suprancrcai urmtorii operatori:
+; -; *; /; %; ^; &; |; ~; !; =; < >; +=; -=; *=; /=; %=; ^=; &=; |=;
>>=; <<=; ==; !=; <=; >=; &&; ||; ++; --; ->* , ->; << >>; []; ();
new; new[]; delete; delete[].
Nu pot fi suprancrcai operatorii: ::, ., .*, ?:, sizeof.
Prin suprancrcarea unui operator nu i se poate modifica aritatea astfel
operatorul ! este unar i poate fi redefinit numai ca operator unar. De asemenia
asociativitatea i precedena operatorului se menin.
La suprancrcarea unui operator nu se pot specifica argumente cu valori
implicite.
Operatorii suprancrcai ntr-o clas sunt motenii n clasele derivate (excepie
face operatorul de atribuire =).
Semntura unei funcii n care se suprancarc un operator este:

tip_rezultat operator#(list_argumente);
Restricii la suprancarcare:

pot fi suprancarcate numai operatorii existeni i la care li se permite;


nu se poate modifica precedena i asociativitatea operatorului;
nu se poate suprancrca operatorii pentru tipurile predefinite;
funciile operatorilor nu pot avea argument implicite;
nu putem suprancarca concomitent doi operatori.

Operatorii pot fi suprancrcai n clas i-n afar clasei. n clas parametrii


operatorului va fi cu unul mai puin, deoarece primul parametru este nsui
obiectul care activeaz aceast operaie. n afara clasei este ca o funcie global,
atunci ea trebuie s fie declarat ca prieten a clasei.
3 Realizarea sarcinii
3.1 Realizarea sarcinii
La scrierea programului urmm paii:
-

Declarm clasa TriD cu nivelul de acces public.


class TriD{
int x;
int y;
int z;

Definim constructorii TriD();TriD(int,int,int);~TriD();


TriD(TriD &);
-

Operatorii +, -!, = i scriem ca metode a clasei iar operatorii


==, !=, <,> ca funcii prietene.
TriD & operator = (TriD &);
TriD & operator + (TriD &);
TriD & operator - (TriD &);
friend istream & operator >>(istream &, TriD &);
friend ostream & operator <<(ostream &, TriD &);
friend bool operator !=(TriD &, TriD &);
friend bool operator ==(TriD &, TriD&);
friend bool operator >(TriD &, TriD &);
friend bool operator <(TriD &, TriD &);

Scriem funciile pentru suprancarcarea operatorilor.


Supraincarcarea operatorului=
TriD & TriD::operator =(TriD & obj){
if(this==&obj) return*this;
this->x=obj.x;
this->y=obj.y;
this->z=obj.z;
return *this;
}
Supraincarcarea operatorului+

TriD & TriD::operator+(TriD & obj){


this->x+=obj.x;
this->y+=obj.y;
this->z+=obj.z;
return*this;
}
Supraincarcarea operatorului-
TriD & TriD::operator-(TriD & obj){
this->x-=obj.x;
this->y-=obj.y;
this->z-=obj.z;
return*this;
}

Scriem funcia principal main(), n care am organizat programul.


Executm programul. In functia principala main() am format si afisare
unui meniu pentru introducerea vizualizarea si efectuarea operatiilor
cu coordonatele spatiale.
Concluzii

Efectund aceast lucrare de laborator am acumulat noi cunotine n


limbajul de programare C++ acumulind cunostinte noi la tema Suprancrcarea
operatorilor. In cadrul programului am supraincarcat operatorii atit ca functii ale
clase cit si ca functii prietene .Am creat clasa TriD de coordinate spatiale si cu
ajutorul operatorilor supraincarcati am efectuat diverse operati cu acestea.
Efectuind aceasta lucrare de laborator am insusit modul de supraincarcare a
operatorilor si directiile de utilizare a acestei proceduri.
Bibliografie
1. Totul despre C i C++. Manualul fundamental de programare de C i C++ Dr.
Kris Jamsa & Lars Klander. Traducere de Eugen Dumitrescu
2. Sergiu G. Istrati Programare. Iniializare n limbajele C i C++. Ciclu de
prelegeri la disciplina Programare Chiinu U.T.M. 2003

12.

Intrebari de control:
1.

?
Nu

2.

?
operator dupa care merge simbolul operatiei. In rest este osimpla functie cu rezultat si
parametric.
3.
?
Nu
4.
?
Exista operatori unari si binari. Operatorii unari sunt acei care au unul si numai unul operator,
binarii au 2 operatori.
5. ?
Complex
Complex

6.

operator++(int);
operator++(int);

//
//

., .*, ?:, ::, sizeof, #, ##.

7.

8.

"()"?
.1

9.

"->"?
->, ,

10.
(
)?
, .
, this. -
, .
. <<
ostream .
- , ,
.
.
11.

"<<"?

?
1

Anexa A
Codul surs al programului
#include <iostream>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class TriD{
int x;
int y;
int z;
public:
TriD();
TriD(int,int,int);
~TriD();
TriD(TriD &);
TriD & operator = (TriD &);
TriD & operator + (TriD &);
TriD & operator - (TriD &);
friend istream & operator >>(istream &, TriD &);
friend ostream & operator <<(ostream &, TriD &);
friend bool operator !=(TriD &, TriD &);
friend bool operator ==(TriD &, TriD&);
friend bool operator >(TriD &, TriD &);
friend bool operator <(TriD &, TriD &);
};
TriD::TriD(){x=0;
y=0;
z=0;
};
TriD::TriD(int x,int y, int z):x(x),y(y),z(z){}
TriD::TriD(TriD & obj):x(obj.x),y(obj.y),z(obj.z){}
TriD::~TriD(){x=0;
y=0;
z=0;}
TriD & TriD::operator =(TriD & obj){
if(this==&obj) return*this;
this->x=obj.x;
this->y=obj.y;
this->z=obj.z;
return *this;
}
TriD & TriD::operator+(TriD & obj){
this->x+=obj.x;
this->y+=obj.y;
this->z+=obj.z;

return*this;
}
TriD & TriD::operator-(TriD & obj){
this->x-=obj.x;
this->y-=obj.y;
this->z-=obj.z;
return*this;
}
istream &operator >>(istream & in , TriD & obj){
cout<<"Introduceti dimensiunea x:";
in>>obj.x;
cout<<"Introduceti dimensiunea y:";
in>>obj.y;
cout<<"Introduceti dimensiunea z:";
in>>obj.z;
return in;
}
ostream &operator <<(ostream & out, TriD & obj){
out<<"Componenta x:"<<obj.x;
out<<"
Componenta y:"<<obj.y;
out<<"
Componenta z:"<<obj.z<<endl;
return out;
}
bool operator ==(TriD & a, TriD & b){
return (a.x==b.x)&&(a.y==b.y)&&(a.z==b.z);
}
bool operator!=(TriD & a, TriD & b){
return (a.x!=b.x)||(a.y!=b.y)||(a.z!=b.z);
}
int main(){
TriD a,b;
TriD d;
char ch='0';
char ch1='0';
int nr=0;
init:system("cls");
cout<<"
MENIU"<<endl;
cout<<"1. Introducerea coordonatelor spatiale"<<endl;
cout<<"2. Operatii cu coordonatele"<<endl;
cout<<"3. Afisarea coordonatelor"<<endl;
cout<<"4. Iesire din program"<<endl;
ch=getch();
switch(ch)
{
case '1' :{cin>>a;
goto init;}break;
case '2': {
cout<<"1.Adunarea coordonatelor cu un numar"<<endl;
cout<<"2.Adunarea a doua puncte cu coordonate spatiale"<<endl;

cout<<"3.Scaderea din coordonate a unui numar"<<endl;


cout<<"4.Scadera a 2 puncte cu coordonate spatiale"<<endl;
cout<<"5.Compararea a doua puncte cu coordonate spatiale"<<endl;
ch1=getch();
switch(ch1){
case '1':{cout<<"Introduceti numarul pentru adunare"<<endl;
cin>>nr;
TriD b(nr,nr,nr);
a=a+b;
cout<<"Coordonatele modificate sunt:";
cout<<a;
getch();
goto init;}break;
case'2':{cout<<"Introduceti coordonatele punctului pentru
adaugare"<<endl;
cin>>d;
a=a+d;
cout<<"Coordonatele modificate sunt"<<endl;
cout<<a;
getch();
goto init;}break;
case '3':{cout<<"Introduceti un numar pentru scaderea din
coordonate:"<<endl;
cin>>nr;
TriD c(nr,nr,nr);
a=a-c;
cout<<"Coordonatele modificate sunt:"<<endl;
cout<<a;
getch();
goto init;}break;
case'4':{cout<<"Introduceti coordonatele punctului pentru
scadere:"<<endl;
cin>>d;
a=a-d;
cout<<"Coordonatele modificate:"<<endl;
cout<<a;
getch();
goto init;} break;
case '5':{cout<<" Introduceti coordonatele puntului pentru a vedea
daka este egal sau nu cu coordonatele aflate in memorie"<<endl;
cin>>b;
if(a==b)cout<<"Punctele au aceleasi coordonate"<<endl;
if(a!=b)cout<<"Punctele sunt diferite"<<endl;
getch();
goto init;
}break;
}break;
case '3':{cout<<a<<endl;
getch();
goto init;}break;

case '4':return 0; break;


}
}
return 0;
}

Anexa B
Afisarea rezultatelor:
Meniul

Introducerea datelor

Afisarea rezultatelor

Operatii cu coordonatele

Adunarea unui numar la coordonate