Vous êtes sur la page 1sur 17

LINGUAGENS PROGRAMAO I

Lobinho Gomes

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Nas programao orientada a objecto e nas respectivas linguagens existe o
conceito de polimorfismo e herana (como j vimos anteriormente). Em
ambos os conceitos possvel usar-se o mesmo mtodo de diferentes formas.
No primeiro caso temos o overloading e no segundo caso o override.
Overloading embora o nome do mtodo seja o mesmo a sua assinatura muda
ex: o numero de parmetros ou o tipo de parmetros diferente de um mtodos
para os outros (este conceito est normalmente associado aos mtodos do mesmo
objecto).
Override neste caso o nome do mtodo e a sua assinatura mantm-se
inalterada, no entanto o mtodo reescrito (de acordo com a especializao do
objecto - herana)

LINGUAGENS PROGRAMAO I

Redefinio de operadores
A forma como se escreve o cdigo que implementa os nossos algoritmos
influenciado pela forma como o nosso modelo cerebral funciona.
Ex: mais natural escrevermos a=b+c; do que escrever b.soma(c); a.soma(b);

A forma como o cdigo est escrito tambm pode facilitar ou dificultar a sua
compreenso (mesmo exemplo que anterior)
As linguagens j implementam este conceito (excepto a linguagem assembly)
para os tipos bsicos de dados, no entanto no o fazem para tipos complexos,
como os objectos.
No entanto essas mesmas linguagens permitem usar os conceitos de
overloading e override aplicados aos operadores, ou seja podemos
redefinir a forma como um determinado operador funciona para os nossos
objecto, tornando assim a escrita do cdigo mais natural e compreensvel.

LINGUAGENS PROGRAMAO I

Redefinio de operadores
A redefinio dos operador pode ento ser feito por
Overloading do operador original (mudando a sua assinatura o que
espectvel visto este ter que se adaptar ao nosso objecto)
Override no caso de no ser esse o interesse (ou na realidade j temos o
operador definido com a mesma assinatura que pretendemos usar mas
queremos usar um algoritmo diferente).
Metodologia:

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Exemplo:
class temp
{
private:
int count;
public:
temp():count(5){ }
void operator ++()
{
count=count+1;
}
void Display() { cout<<"Count: "<<count; }
};

LINGUAGENS PROGRAMAO I

Redefinio de operadores
No exemplo anterior o operador actua somente sobre o prprio objecto, no
entanto muitas vezes o operador deve actuar sobre mais que um objecto:

Ex: resultado guardado no prprio objecto


class temp
{
private:
int count;
public:
temp():count(5){ }
void operator +( temp x)
{
count=count+x.count;
}
void Display() { cout<<"Count: "<<count; }
};
int main()
{
temp a, b;
a+b;
}

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Ex: resultado guardado num outro objecto (neste caso os objecto mam a sua
informao anterior.
class temp
{
private:
int count;
public:
temp(int c):count(c){ }
temp operator +( temp x)
{
int count_aux;
count_aux=count+x.count;
return (temp(count_aux));
}
temp operator =(temp x);
void Display() { cout<<"Count: "<<count; }
};
int main()
{

temp a(3), b(10),c(0);


c=a+b;
}

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Exemplo: nmeros complexos
#include<stdio.h>
#include<iostream>
using namespace std;
class Complex
{
public:
Complex(double re,double im)
:real(re),imag(im)
{};
Complex operator+(const Complex& other);//metodo antigo:void soma(Complexo x);
Complex operator=(const Complex& other);
Complex operator*(const Complex& other);
double re();
double im();
void show();
private:
double real;
double imag;
};

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Exemplo: nmeros complexos
double Complex::re()
{
return(real);
}
double Complex::im()
{
return(imag);
}
void Complex::show()
{
cout <<real<<"+j"<<imag;
}
Complex Complex::operator+(const Complex& other)
{
double result_real = real + other.real;
double result_imaginary = imag + other.imag;
return Complex( result_real, result_imaginary );
}
Complex Complex::operator=(const Complex& other)
{
double result_real = other.real;
double result_imaginary = other.imag;
return Complex( result_real, result_imaginary );
}

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Exemplo: nmeros complexos
Complex Complex::operator*(const Complex& other)
{
double result_real = real*other.real-imag*other.imag;
double result_imaginary = real*other.imag+imag*other.real;
return Complex( result_real, result_imaginary );
}
int main()
{
Complex a(3,2);
Complex b(2,3);
Complex c=a+b;
Complex d=a*b;
cout<<"\na=";a.show();
cout<<" ; b=";b.show();
cout << "\n soma =" <<c.re()<<"+j"<<c.im()<< '\n';
cout << "\n Multi =" <<d.re()<<"+j"<<d.im()<< '\n';
return 0;
}

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Operadores que podem ser redefinidos.
Aritmticos

Bitwise

&

>>

<<

Unrios

++

--

<<

>>

Relacionais

==

!=

>

<

>=

<=

Logical

&&

||

Atribuio

+=

-=

*=

/=

%=

|=

&=

[]

()

->

->*

new delete

?:

.*

::

No usveis

sizeof

^=

<<=

>>=

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Exerccio
Refazer o objecto de uma aula anterior que encapsula uma string, onde se
deve substituir o mtodo de conteno de duas strings pela redefinio dos
operadores (=) e (+).

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Resoluo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
class Cstring{
private:
char m_Str[100];
int m_iNum;
public:
Cstring();
~Cstring();
Cstring(char str[]);
void setString(char str[]);
int toInt();
double toDouble();
void toString(int x);
void toString(double x);
char* getString();
Cstring operator +(Cstring& x);
Cstring operator =(Cstring& x);
};

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Resoluo

Continuao

Cstring Cstring::operator +(Cstring& x)


{
char aux[100];
strcpy(aux,m_Str);
strcat(aux,x.m_Str);
return Cstring(aux);
}
Cstring Cstring::operator =(Cstring& x)
{
return(Cstring(x.m_Str));
}
Cstring::~Cstring()
{

}
Cstring::Cstring()
{
}

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Resoluo

Continuao

Cstring::Cstring(char str[])
{
strcpy(m_Str, str);
}
void Cstring::setString(char str[])
{
strcpy(m_Str, str);
}
int Cstring::toInt()
{
return atoi(m_Str);
}
double Cstring::toDouble()
{
return atof(m_Str);
}

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Resoluo

Continuao

void Cstring::toString(int x)
{
sprintf(m_Str, "%d", x);
}
void Cstring::toString(double x)
{
sprintf(m_Str, "%f", x);
}
char* Cstring::getString()
{
return m_Str;
}

LINGUAGENS PROGRAMAO I

Redefinio de operadores
Resoluo

Continuao

int main(void)
{
Cstring s1("string 1");
Cstring s2("string2");
s1.setString("string1");
printf("\nstring1 = '%s'; string2 = '%s';\n", s1.getString(), s2.getString());

s1.toString(2534);
s2.toString(15.32);
printf("\nstring1 = '%s'; string2 = '%s';\n", s1.getString(), s2.getString());
printf("\nstring1 = '%d'; string2 = '%f';\n", s1.toInt(), s2.toDouble());

Cstring S3=s1+s2;
printf("\nstring3 = '%s';\n", S3.getString());
return 0;
}

Vous aimerez peut-être aussi