Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Você pode me dar um exemplo de overload de operadores?

2 Respostas

+2 votos
respondida Abr 8, 2016 por Saulo (436 pontos)  

Uma tradução para C++ do exemplo é mostrada a seguir. Neste exemplo foi explorado: sobrecarga do operador +, sobrecarga do operador << e sobrecarga do método print_method.

    #include <iostream>
#include <string>

using namespace std;

class ComplexNumber
{
    private:
    float real;
    float imaginary;

    void print_number(std::ostream& os, const string& printMethod = "special") const {
        if (printMethod.compare("special")==0) os << real << "+" << imaginary << "i";
        else os << real << " " << imaginary;
    }

    public:
    ComplexNumber(float real = 0, float imaginary = 0) {
        this->real = real;
        this->imaginary = imaginary;
    }

    ComplexNumber( const ComplexNumber &obj) {  // copy constructor
        this->real = obj.real;
        this->imaginary = obj.imaginary;
    }

    void print_number(const string& printMethod = "special") {
        print_number(std::cout, printMethod);
    }

    friend std::ostream& operator << (std::ostream& os, const ComplexNumber& complexNumber) {
        complexNumber.print_number(os);
        return os;
    }

    friend ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber &c2) {
    return ComplexNumber(c1.real + c2.real, c1.imaginary + c2.imaginary);
    }
};

int main(int argc, char* argv[])
{
    ComplexNumber a(1, 2);

    ComplexNumber b(3,4);

    ComplexNumber c(a+b);

    ComplexNumber d;
    d = a+b+c;

    a.print_number("special");
    cout << endl;

    b.print_number("not special");
    cout << endl;

    cout << c << endl << d << endl;

    return 0;
} 
+1 voto
respondida Mar 24, 2016 por danielcajueiro (5,666 pontos)  

Veja dois exemplos abaixo. No primeiro exemplo, usamos o método mágico \(\_\_add\_\_\) para mudar o comportamento de \(+\) para uma classe para lidar com números complexos:

class ComplexNumber:
    def __init__(self,real,imaginary):
        self.real=real
        self.imaginary=imaginary

    def print_number(self):
        print(str(self.real)+'+'+str(self.imaginary)+'i')

    def __add__(self,other):
        return ComplexNumber(self.real+other.real,self.imaginary+other.imaginary)

if __name__ == '__main__':
    a=ComplexNumber(1,2)
    a.print_number()

    b=ComplexNumber(3,4)
    b.print_number()

    c=a+b
    c.print_number()    

No segundo exemplo, o método print_number muda de comportamento dependendo do número de parâmetros passados pela função:

class ComplexNumber:
    def __init__(self,real,imaginary):
        self.real=real
        self.imaginary=imaginary

    def print_number(self,printMethod=None):
        if(printMethod=='special'):
            print(str(self.real)+'+'+str(self.imaginary)+'i')
        else:
            print(self.real,' ',self.imaginary)        

if __name__ == '__main__':
    a=ComplexNumber(1,2)
    a.print_number(printMethod='special')

    b=ComplexNumber(3,4)
    b.print_number()
...