Académique Documents
Professionnel Documents
Culture Documents
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:
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()
{
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()
{
}
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;
}