Descărcați ca pdf sau txt
Descărcați ca pdf sau txt
Sunteți pe pagina 1din 11

Ministerul Educaţiei 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.

Chişinău 2014
1 Scopul si sarcina lucrării
1.1 Scopul lucrării:
 studierea necesităţii supraîncărcării operatorilor;
 studierea sintaxei de definire a operatorilor;
 studierea tipurilor de operatori;
 studierea formelor de supraîncărcare.
1.2 Sarcina lucrării:
Să se creeze clasa 3-D de coordonate în spaţiu. Să se definească operatorii
"+", "-", "=", ca metode ale clasei, iar operatorii de comparare – ca funcţii
prietene. De prevăzut posibilitatea realizării de operaţii atît între coordonate cît şi
între coordonate şi numere obişnuite.
2 Indicaţii teoretice
Prin supraîncărcarea unui operator se înţelege că acesta este utilizat în
contexte diferite, avînd aceeaşi semnificaţie sau o semnificaţie diferită. Astfel
operatorul „+” este supraîncărcat pentru adunarea întregilor şi a realilor;
operatorul „<<” este supraîncărcat cu semnificaţia de deplasare la stînga, dacă
termenii sunt întregi sau inserare în flux, dacă un termen este un flux de date, iar
celălalt un obiect.
Programatorul poate asocia noi semnificaţii operatorilor existenţi prin
supraîncărcarea operatorilor. Anumiţi operatori pot fi utilizaţi cu orice tip de
termeni (sunt deja supraîncărcaţi global de către compilator). Aceştia sunt: new,
delete, sizeof, ::, =, &, ->*, .*, ., ->.
Pot fi supraîncărcaţi următorii operatori:
+; -; *; /; %; ^; &; |; ~; !; =; < >; +=; -=; *=; /=; %=; ^=; &=; |=;
>>=; <<=; ==; !=; <=; >=; &&; ||; ++; --; ->* , ->; << >>; []; ();
new; new[]; delete; delete[].
Nu pot fi supraîncărcaţi operatorii: ::, ., .*, ?:, sizeof.
Prin supraîncărcarea unui operator nu i se poate modifica aritatea astfel
operatorul ! este unar şi poate fi redefinit numai ca operator unar. De asemenia
asociativitatea şi precedenţa operatorului se menţin.
La supraîncărcarea unui operator nu se pot specifica argumente cu valori
implicite.
Operatorii supraîncărcaţi într-o clasă sunt moşteniţi în clasele derivate (excepţie
face operatorul de atribuire =).
Semnătura unei funcţii în care se supraîncarcă un operator este:
tip_rezultat operator#(listă_argumente);
Restricţii la supraîncarcare:
 pot fi supraîncarcate numai operatorii existenţi şi la care li se permite;
 nu se poate modifica precedenţa şi asociativitatea operatorului;
 nu se poate supraîncărca operatorii pentru tipurile predefinite;
 funcţiile operatorilor nu pot avea argument implicite;
 nu putem supraîncarca concomitent doi operatori.
Operatorii pot fi supraîncărcaţi în clasă şi-n afar clasei. În clasă parametrii
operatorului va fi cu unul mai puţin, deoarece primul parametru este însuşi
obiectul care activează această operaţie. În afara clasei este ca o funcţie globală,
atunci ea trebuie să fie declarată ca prietenă a clasei.
3 Realizarea sarcinii
3.1 Realizarea sarcinii
La scrierea programului urmăm paşii:
- Declarăm 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 funcţii 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 funcţiile pentru supraîncarcarea 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 funcţia principală main(), în care am organizat programul.


Executăm programul. In functia principala main() am format si afisare
unui meniu pentru introducerea vizualizarea si efectuarea operatiilor
cu coordonatele spatiale.
Concluzii
Efectuînd această lucrare de laborator am acumulat noi cunoştinţe în
limbajul de programare C++ acumulind cunostinte noi la tema “Supraîncărcarea
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. Iniţializare în limbajele C şi C++. Ciclu de
prelegeri la disciplina “Programare”” Chişinău U.T.M. 2003
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 operator++(int); // постфиксная форма
Complex operator++(int); // постфиксная форма

6. Какие операторы нельзя перегружать?


“.”, “.*”, “?:”, “::”, “sizeof”, “#”, “##”.

7. Каков синтаксис вызова операторов?

8. Как используется оператор "()"?


Оператор круглые скобки используется для определения функциональных объектов.1

9. Как используется оператор "->"?


->, при его перегрузке переменная начинает себя вести как указатель, что подводит нас к
идиоме умных указателей
10. Зачем нужны две формы перегрузки (как метод класса и как дружественная
функция)?
Причина этого состоит в том, как вызываются методы класса. Практически всегда
передается объект, используя скрытый указатель this. Если нужно еще что-нибудь
передать, то используются обычные параметры. То есть первый операнд обязательно
должен быть представителем данного класса. В случае оператора << первый операнд типа
ostream а не определяемого нами. Другими словами если нужно сложить комплексное с
целым то это может сделать как оператор-метод класса, так и друг, а сложить целое и
комплексное – только друг. То есть в данном случае от перемены мест слагаемых все
меняется.

11. Какому типу принадлежит оператор вывода в поток "<<"?


Дружественный
12. В каких случаях обязательно определять оператор присваивания?

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

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