Documente Academic
Documente Profesional
Documente Cultură
Lab3 PDF
Lab3 PDF
REFERAT
La Lucrare de laborator nr.3
la disciplina: Programarea in limbajul C++
Tema: Supraincarcarea operatorilor
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;
Supraincarcarea operatorului”-”
1
Anexa A
Codul sursă al programului
#include <iostream>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
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 '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