SlideShare une entreprise Scribd logo
1  sur  10
Télécharger pour lire hors ligne
C++ - Sobrecarga de Operadores

       Sobrecarregar um operador significa redefinir seu símbolo, de maneira que ele
se aplique também a tipos de dados definidos pelo usuário como classes e estruturas.

     A implementação de sobrecarga de operadores é definida por meio de funções
chamadas operadoras , criadas como membro da classe ou como funções globais.

Limitações : Respeitar a definição original do operador
     • Não é possível mudar o operador de unário para binário.
     • Não se pode inventar símbolos novos.
     • Não é possível modificar a precedência de operadores por meio de
        sobrecarga.
     • Operadores que não podem ser sobrecarregados:
            • . (operador ponto)
            • :: (operador de resolução de escopo)
            • ? : (operador ternário)

Sobrecarga de Operadores Unários : Operador de incremento pré-fixado

class ponto
{      private :
             int x, y;
       public :
             ponto (int x1=0, int y1=0) {x=x1; y=y1;}   // construtor

            ponto operator ++( )           // função operadora pré-fixada
            {     ++x; ++y;
                  return ponto(x, y);
            }
            void printpt( ) const          // imprime ponto
            {     cout << ‘(‘ << x << ‘,’ << y << ‘)’;        }
};
void main( )
{     ponto p1, p2(2,3), p3;                      // declara e inicializa
      cout << “n p1 = “ ; p1.printpt( );         // imprime
      cout << “n++p1 = “ ; (++p1).printpt( );           // incrementa e imprime
      p3 = ++p2;                                  // incrementa e atribui
      cout << “n p3 = “ ; p3.printpt( );         // imprime                }
Observ.: ++p1 ;    é equivalente a           p1.operator++( );

Sobrecarga do operador de incremento pós-fixado : Para distinguir entre as
formas pré e pós-fixada, o compilador utiliza o número de argumentos da função
operadora.
      • sem parâmetro : pré-fixado         operator ++ ( )
      • com um parâmetro do tipo int : pós-fixadooperator ++ (int)

ponto operator ++(int)          // função operadora pós-fixada
{     ++x; ++y;
      return ponto(x-1, y-1);
}

Sobrecarga de operadores binários : função operadora com um argumento.
                            Ex.: sobrecarga do + aritmético
class venda
{      ...
       venda operator + (venda v) const;      // função operadora
       ...
}
venda venda :: operator + (venda v) const // soma dois objetos
{      int pec = npecas + v.pecas;
       float pre = preco + v.preco;
       return venda(pec, pre);
}
       ...
void main( )
{      venda A(58, 12734.53), B(30, 6000.30), T;
       T = A + B; ...                                      }
Somando objetos da classe ponto : funções operadoras

class ponto
{      ...
       ponto operator + (ponto p) const     // soma dois objetos
       {     return ponto(x+p.x, y+p.y);    }
       ponto operator + (int n) const       // soma um número a um objeto
       {     return ponto(x+n, y+n);        }
}
void main( )
{      ...
p3 = p1 + p2;
      p4 = p1 + 5;
      ...                  }

Observ.: p4 = p1 + 5 ; é equivalente a      p4 = p1.operator + (5);
por isso não podemos escrever instruções p4 = 5 + p1;
que seriam interpretadas como: p4 = 5. operator + (p1) // errado

Operadores para manipular strings : +=, +, <, ==, >
enum Boolean { False, True};
class string
{      ...
       string operator +=(string s) const
       {      string temp;
              if (strlen(str) + strlen(s.str) < MAX)
              {       strcpy( temp.str, str);
                      strcat(temp.str, s.str);   }
              else cout << “ nMemória Esgotada!! “;
              return temp;                           }

      string operator +(string s) const         // concatena
      {      string temp;
             temp +=s.str;
             return temp;                              }
      Boolean operator < (string s) const
      {      return (strcmp(str, s.str) < 0) ? True : False; }

      Boolean operator ==(string s) const
      {    return (strcmp(str, s.str) == 0) ? True : False;}

      string getstr( )
      {      gets(str);
             return string(str);                                   }
      ...
}
void main ( )
{     string s[MAX];
      for (int n=0; n<= 80; n++)
      {      cout << “ nDigite nome ou <enter> para encerrar “;
             if (s[n].getstr( ) == “”) break;
}
      cout << “ nLista Original”;
      for (int i=0; i<n ; i++)
      {      cout << “ ns[ “ << i << “] = “;
             s[i].print( );
      }
      ordena (s, n);
      cout << “ nLista Ordenada”;
      for (int i=0; i<n ; i++)
      {      cout << “ ns[ “ << i << “] = “;
             s[i].print( );
      }
}

void ordena (string s[ ], int n)
{     string temp; int j;
      for (int i=0; i<n ; i++)
             for ( j=i+1; j<n ; j++)
                     if (s[i] > s[j])
                     {       temp =s[i]; s[i] = s[j]; s[j] = temp     }
}

Sobrecarga do operador [ ] : checagem de limites de matrizes

#include <iostream.h>
#include <iomanip.h>
const MAX = 50;
class matriz
{     private :
             float n[MAX];
      public :
             matriz( );                               // construtor
             float& operator [ ] (int indice); // sobrecarga de [ ]
             float media( int i);
};

matriz :: matriz( )
{     for( int i=0; i < MAX; i++)        n[i] = 0.0;         }

float& matriz :: operator [ ] (int indice)
{      static float x = -1;
       if ( indice >= 0 && indice < MAX)
               return n[indice];
       else
       {       cout << "nFora de limite";
               return x;                      }
}

float matriz :: media (int i)
{      float m= 0.0;
       for (int j=0; j<i; j++)   m += n[j];
       return m/float(i);             }

void main( )
{     matriz notas;
      cout << setprecision(2);
      int i=0;
      do {
             cout << ""nDigite a nota do aluno " << (i+1) << " : ";
             cin >> notas [i];
      } while (notas[i++] >= 0);
      cout << "nMedia das notas : " << notas.media(i);                }

Observ. : A função operator[ ] retorna uma referência a um elemento da matriz n.
Dessa forma, a expressão notas[i] age como o próprio elemento da matriz privada,
podendo ser usada em instruções como
             cin >> notas[i]; ou      notas[i] = 6.7;
      A função operator[ ] cria uma variável static , pois não é possível retornar
referência a uma variável automática.

Conversões entre tipos básicos :
     • implícita                       double dvar = 'A';
     • explícita (operdor molde)       double dvar = double ('A');
Conversão de tipos com classes :

• objetos a tipos básicos - sobrecarga do operador molde criando função
  conversora.
  Ex.: Conversão de um objeto string a tipo int ou float

#include <stdlib.h>
...
class string
{      ...
       operator int( ) const           // função conversora
       {     return atoi(str);         }

      operator double( ) const // função conversora
      {     return atof(str);         }
      ...
};
void main ( )
{     string s1("1234"), s2("1234.56");
      int i = s1;              // conversão de string para int
      double d = s2;           // conversão de string para double
      ...
}

• tipos básicos a objetos : sobrecarga do operador de atribuição =
      Ex.: conversão de um int a um objeto string.
Class string
{     ...
      void operator = (int n)            // sobrecarga do operador de atribuição
      {      itoa(n, str, 10);     }
      ...
};
void main ( )
{     string s;
      s = 5392;             // conversão de inteiro para string
      ...
}

• objeto a objeto (classes diferentes ) -     objA = objB

Dois métodos :
      • função-membro conversora da classe B
      • construtor membro da classe A

Primeiro método : função conversora
Classes graus e radianos. Converter objetos da classe radianos em objetos da classe
graus (grau = radiano). Função conversora na classe radianos.
#include <iostream.h>
#include <iomanip.h>
#define PI 3.141592653
class graus
{      private :
             double g;
       public :
             graus (double x) { g=x;           }
             graus ( )     { g = 0;     }
             void print( )
             {     cout << setiosflags (ios :: fixed)
                           << setiosflags (ios :: showpoint)
                           << setprecision (2) << g << “ xf8n”;
             }
};

class radianos
{      private:
              double rad;
       public :
              radianos (double r) { rad = r ; }
              radianos ( )         {rad = 0.0 ;        }
              operator graus ( )          // função conversora de rad. para graus
              {     return graus(180.0*rad/PI);        }
              void print( )
              {     cout << setioflags (ios :: fixed)
                            << setiosflags (ios :: showpoint)
                            << setprecision (2) << rad << “ rad n”;
              }
};
void main( )
{      graus gr;
       radianos rd(PI);
       gr = rd;             // converte radianos para graus
       ...
}

Segundo método : função construtora (implementada na classe graus)
class radianos
{      ...
       public :
             double getrad ( )   {return rad; }
             ...
};

class graus
{      ...
       graus (radianos rd)       // construtor para conversão
       {     g = (180.0 * rd.getrad( ) / PI; }
       ...
};

void main( )
{     graus gr;
      radianos rd(PI);
      gr = rd;            // converte radianos para graus
      ...
}

     • conversões dos dois lados : (graus em radianos e radianos em graus)
As duas funções presentes na mesma classe.

class radianos
{
       ...
};

class graus
{
       ...
       public :
             graus (radianos rd)       // construtor para conversão
             {     g = (180.0 * rd.getrad( ) / PI; }

             operator radianos ( )    // função conversora de tipo
             {     return radianos(g * PI / 180.0); }
      ...
};
void main ( )
{     graus gr, gr1(180.0);
      radianos rd(PI), rd1;
      gr = rd;            // converte radianos para graus
      rd1 = gr1;          // converte graus para radianos
      ...
}

 Conversões : quando usar o quê ? Quando as duas classes são acessíveis,
podemos escolher entre o uso de função conversora ou construtora. Porém se uma
das classes pertencer a uma biblioteca, da qual não temos acesso ao fonte, dois casos
podem acontecer . Se usarmos instruções como:
       • meu_obj = lib_obj;
devemos implementar função construtora de um argumento. Já nas instruções:
       • lib_obj = meu_obj;
temos que implementar função conversora de tipo.

                                  Exercícios
Assunto : Sobrecarga de Operadores.

       Crie uma classe que defina um número complexo x + yi, onde x e y são do
tipo float e i é a raiz quadrada de -1. Defina as operações aritméticas entre números
complexos nesta classe.

                                    Prática VIII

Defina uma classe chamada fração. Esta classe deve armazenar o numerador e o
denominador de uma fração em duas variáveis inteiras. Inclua :
      a ) dois construtores: o primeiro sem argumentos e o outro que recebe
        numerador e denominador da fração;
      b) uma função-membro que retorna o numerador e outra que retorna o
        denominador;
      c) as operações de adição, subtração, multiplicação e divisão;
      d ) as operações de incremento e decremento pré-fixadas;
      e) um conversor de tipo que converte um objeto fração para um tipo float;
Sobrecarga operadores

Contenu connexe

Tendances

Aula 03 - Layout e Integração de formulário com HTML e PHP
Aula 03  - Layout e Integração de formulário com HTML e PHPAula 03  - Layout e Integração de formulário com HTML e PHP
Aula 03 - Layout e Integração de formulário com HTML e PHP
Dalton Martins
 
Bens públicos
Bens públicosBens públicos
Bens públicos
Gian Silva
 
Custo de vida, inflação e indices de preços
Custo de vida, inflação e indices de preçosCusto de vida, inflação e indices de preços
Custo de vida, inflação e indices de preços
Luciano Pires
 
Il tutorial di Python
Il tutorial di PythonIl tutorial di Python
Il tutorial di Python
AmmLibera AL
 
Lista de exercícios resolvidos
Lista de exercícios resolvidosLista de exercícios resolvidos
Lista de exercícios resolvidos
Crishna Irion
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
Regis Magalhães
 

Tendances (20)

Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetos
 
Por que FreeBSD?
Por que FreeBSD?Por que FreeBSD?
Por que FreeBSD?
 
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com JavaExercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 
Aula 03 - Layout e Integração de formulário com HTML e PHP
Aula 03  - Layout e Integração de formulário com HTML e PHPAula 03  - Layout e Integração de formulário com HTML e PHP
Aula 03 - Layout e Integração de formulário com HTML e PHP
 
Conceitos base de programação - parte 2
Conceitos base de programação - parte 2Conceitos base de programação - parte 2
Conceitos base de programação - parte 2
 
Aula 4 herança, sobrescrita de métodos, construtor
Aula 4   herança, sobrescrita de métodos, construtorAula 4   herança, sobrescrita de métodos, construtor
Aula 4 herança, sobrescrita de métodos, construtor
 
Introdução a Linguagem de Programação C
Introdução a Linguagem de Programação CIntrodução a Linguagem de Programação C
Introdução a Linguagem de Programação C
 
Algoritmos e Programação: Estruturas de repetição
Algoritmos e Programação: Estruturas de repetiçãoAlgoritmos e Programação: Estruturas de repetição
Algoritmos e Programação: Estruturas de repetição
 
Bens públicos
Bens públicosBens públicos
Bens públicos
 
POO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & ObjetPOO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & Objet
 
Custo de vida, inflação e indices de preços
Custo de vida, inflação e indices de preçosCusto de vida, inflação e indices de preços
Custo de vida, inflação e indices de preços
 
POO - 06 - Encapsulamento
POO - 06 - EncapsulamentoPOO - 06 - Encapsulamento
POO - 06 - Encapsulamento
 
Correlação e Classificação
Correlação e ClassificaçãoCorrelação e Classificação
Correlação e Classificação
 
Estruturas em C++ (struct)
Estruturas em C++ (struct)Estruturas em C++ (struct)
Estruturas em C++ (struct)
 
Chapitre 2 classe et objet
Chapitre 2   classe et objetChapitre 2   classe et objet
Chapitre 2 classe et objet
 
Il tutorial di Python
Il tutorial di PythonIl tutorial di Python
Il tutorial di Python
 
Lista de exercícios resolvidos
Lista de exercícios resolvidosLista de exercícios resolvidos
Lista de exercícios resolvidos
 
Héritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLIHéritage et polymorphisme- Jihen HEDHLI
Héritage et polymorphisme- Jihen HEDHLI
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 

Similaire à Sobrecarga operadores

introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003
elliando dias
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
Ricardo Bolanho
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
Luciano Ramalho
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
gjpbg
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
Leandro Lopes
 

Similaire à Sobrecarga operadores (20)

RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Tdc2010
Tdc2010Tdc2010
Tdc2010
 
apostila C++
apostila C++apostila C++
apostila C++
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros
 
Linguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesLinguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e Funções
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003
 
Programação Estruturada 2 - Aula 02
Programação Estruturada 2 - Aula 02Programação Estruturada 2 - Aula 02
Programação Estruturada 2 - Aula 02
 
Design OO
Design OODesign OO
Design OO
 
9 structs e ponteiros
9   structs e ponteiros9   structs e ponteiros
9 structs e ponteiros
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
 
Linguagem Go
Linguagem GoLinguagem Go
Linguagem Go
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Ed1
Ed1Ed1
Ed1
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Programação Funcional (para humanos)
Programação Funcional (para humanos)Programação Funcional (para humanos)
Programação Funcional (para humanos)
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 
Programação Estruturada 2 - Aula 02 - Código Fonte
Programação Estruturada 2 - Aula 02 - Código FonteProgramação Estruturada 2 - Aula 02 - Código Fonte
Programação Estruturada 2 - Aula 02 - Código Fonte
 
Clean code
Clean codeClean code
Clean code
 

Sobrecarga operadores

  • 1. C++ - Sobrecarga de Operadores Sobrecarregar um operador significa redefinir seu símbolo, de maneira que ele se aplique também a tipos de dados definidos pelo usuário como classes e estruturas. A implementação de sobrecarga de operadores é definida por meio de funções chamadas operadoras , criadas como membro da classe ou como funções globais. Limitações : Respeitar a definição original do operador • Não é possível mudar o operador de unário para binário. • Não se pode inventar símbolos novos. • Não é possível modificar a precedência de operadores por meio de sobrecarga. • Operadores que não podem ser sobrecarregados: • . (operador ponto) • :: (operador de resolução de escopo) • ? : (operador ternário) Sobrecarga de Operadores Unários : Operador de incremento pré-fixado class ponto { private : int x, y; public : ponto (int x1=0, int y1=0) {x=x1; y=y1;} // construtor ponto operator ++( ) // função operadora pré-fixada { ++x; ++y; return ponto(x, y); } void printpt( ) const // imprime ponto { cout << ‘(‘ << x << ‘,’ << y << ‘)’; } }; void main( ) { ponto p1, p2(2,3), p3; // declara e inicializa cout << “n p1 = “ ; p1.printpt( ); // imprime cout << “n++p1 = “ ; (++p1).printpt( ); // incrementa e imprime p3 = ++p2; // incrementa e atribui cout << “n p3 = “ ; p3.printpt( ); // imprime }
  • 2. Observ.: ++p1 ; é equivalente a p1.operator++( ); Sobrecarga do operador de incremento pós-fixado : Para distinguir entre as formas pré e pós-fixada, o compilador utiliza o número de argumentos da função operadora. • sem parâmetro : pré-fixado operator ++ ( ) • com um parâmetro do tipo int : pós-fixadooperator ++ (int) ponto operator ++(int) // função operadora pós-fixada { ++x; ++y; return ponto(x-1, y-1); } Sobrecarga de operadores binários : função operadora com um argumento. Ex.: sobrecarga do + aritmético class venda { ... venda operator + (venda v) const; // função operadora ... } venda venda :: operator + (venda v) const // soma dois objetos { int pec = npecas + v.pecas; float pre = preco + v.preco; return venda(pec, pre); } ... void main( ) { venda A(58, 12734.53), B(30, 6000.30), T; T = A + B; ... } Somando objetos da classe ponto : funções operadoras class ponto { ... ponto operator + (ponto p) const // soma dois objetos { return ponto(x+p.x, y+p.y); } ponto operator + (int n) const // soma um número a um objeto { return ponto(x+n, y+n); } } void main( ) { ...
  • 3. p3 = p1 + p2; p4 = p1 + 5; ... } Observ.: p4 = p1 + 5 ; é equivalente a p4 = p1.operator + (5); por isso não podemos escrever instruções p4 = 5 + p1; que seriam interpretadas como: p4 = 5. operator + (p1) // errado Operadores para manipular strings : +=, +, <, ==, > enum Boolean { False, True}; class string { ... string operator +=(string s) const { string temp; if (strlen(str) + strlen(s.str) < MAX) { strcpy( temp.str, str); strcat(temp.str, s.str); } else cout << “ nMemória Esgotada!! “; return temp; } string operator +(string s) const // concatena { string temp; temp +=s.str; return temp; } Boolean operator < (string s) const { return (strcmp(str, s.str) < 0) ? True : False; } Boolean operator ==(string s) const { return (strcmp(str, s.str) == 0) ? True : False;} string getstr( ) { gets(str); return string(str); } ... } void main ( ) { string s[MAX]; for (int n=0; n<= 80; n++) { cout << “ nDigite nome ou <enter> para encerrar “; if (s[n].getstr( ) == “”) break;
  • 4. } cout << “ nLista Original”; for (int i=0; i<n ; i++) { cout << “ ns[ “ << i << “] = “; s[i].print( ); } ordena (s, n); cout << “ nLista Ordenada”; for (int i=0; i<n ; i++) { cout << “ ns[ “ << i << “] = “; s[i].print( ); } } void ordena (string s[ ], int n) { string temp; int j; for (int i=0; i<n ; i++) for ( j=i+1; j<n ; j++) if (s[i] > s[j]) { temp =s[i]; s[i] = s[j]; s[j] = temp } } Sobrecarga do operador [ ] : checagem de limites de matrizes #include <iostream.h> #include <iomanip.h> const MAX = 50; class matriz { private : float n[MAX]; public : matriz( ); // construtor float& operator [ ] (int indice); // sobrecarga de [ ] float media( int i); }; matriz :: matriz( ) { for( int i=0; i < MAX; i++) n[i] = 0.0; } float& matriz :: operator [ ] (int indice)
  • 5. { static float x = -1; if ( indice >= 0 && indice < MAX) return n[indice]; else { cout << "nFora de limite"; return x; } } float matriz :: media (int i) { float m= 0.0; for (int j=0; j<i; j++) m += n[j]; return m/float(i); } void main( ) { matriz notas; cout << setprecision(2); int i=0; do { cout << ""nDigite a nota do aluno " << (i+1) << " : "; cin >> notas [i]; } while (notas[i++] >= 0); cout << "nMedia das notas : " << notas.media(i); } Observ. : A função operator[ ] retorna uma referência a um elemento da matriz n. Dessa forma, a expressão notas[i] age como o próprio elemento da matriz privada, podendo ser usada em instruções como cin >> notas[i]; ou notas[i] = 6.7; A função operator[ ] cria uma variável static , pois não é possível retornar referência a uma variável automática. Conversões entre tipos básicos : • implícita double dvar = 'A'; • explícita (operdor molde) double dvar = double ('A'); Conversão de tipos com classes : • objetos a tipos básicos - sobrecarga do operador molde criando função conversora. Ex.: Conversão de um objeto string a tipo int ou float #include <stdlib.h>
  • 6. ... class string { ... operator int( ) const // função conversora { return atoi(str); } operator double( ) const // função conversora { return atof(str); } ... }; void main ( ) { string s1("1234"), s2("1234.56"); int i = s1; // conversão de string para int double d = s2; // conversão de string para double ... } • tipos básicos a objetos : sobrecarga do operador de atribuição = Ex.: conversão de um int a um objeto string. Class string { ... void operator = (int n) // sobrecarga do operador de atribuição { itoa(n, str, 10); } ... }; void main ( ) { string s; s = 5392; // conversão de inteiro para string ... } • objeto a objeto (classes diferentes ) - objA = objB Dois métodos : • função-membro conversora da classe B • construtor membro da classe A Primeiro método : função conversora Classes graus e radianos. Converter objetos da classe radianos em objetos da classe graus (grau = radiano). Função conversora na classe radianos.
  • 7. #include <iostream.h> #include <iomanip.h> #define PI 3.141592653 class graus { private : double g; public : graus (double x) { g=x; } graus ( ) { g = 0; } void print( ) { cout << setiosflags (ios :: fixed) << setiosflags (ios :: showpoint) << setprecision (2) << g << “ xf8n”; } }; class radianos { private: double rad; public : radianos (double r) { rad = r ; } radianos ( ) {rad = 0.0 ; } operator graus ( ) // função conversora de rad. para graus { return graus(180.0*rad/PI); } void print( ) { cout << setioflags (ios :: fixed) << setiosflags (ios :: showpoint) << setprecision (2) << rad << “ rad n”; } }; void main( ) { graus gr; radianos rd(PI); gr = rd; // converte radianos para graus ... } Segundo método : função construtora (implementada na classe graus)
  • 8. class radianos { ... public : double getrad ( ) {return rad; } ... }; class graus { ... graus (radianos rd) // construtor para conversão { g = (180.0 * rd.getrad( ) / PI; } ... }; void main( ) { graus gr; radianos rd(PI); gr = rd; // converte radianos para graus ... } • conversões dos dois lados : (graus em radianos e radianos em graus) As duas funções presentes na mesma classe. class radianos { ... }; class graus { ... public : graus (radianos rd) // construtor para conversão { g = (180.0 * rd.getrad( ) / PI; } operator radianos ( ) // função conversora de tipo { return radianos(g * PI / 180.0); } ... };
  • 9. void main ( ) { graus gr, gr1(180.0); radianos rd(PI), rd1; gr = rd; // converte radianos para graus rd1 = gr1; // converte graus para radianos ... } Conversões : quando usar o quê ? Quando as duas classes são acessíveis, podemos escolher entre o uso de função conversora ou construtora. Porém se uma das classes pertencer a uma biblioteca, da qual não temos acesso ao fonte, dois casos podem acontecer . Se usarmos instruções como: • meu_obj = lib_obj; devemos implementar função construtora de um argumento. Já nas instruções: • lib_obj = meu_obj; temos que implementar função conversora de tipo. Exercícios Assunto : Sobrecarga de Operadores. Crie uma classe que defina um número complexo x + yi, onde x e y são do tipo float e i é a raiz quadrada de -1. Defina as operações aritméticas entre números complexos nesta classe. Prática VIII Defina uma classe chamada fração. Esta classe deve armazenar o numerador e o denominador de uma fração em duas variáveis inteiras. Inclua : a ) dois construtores: o primeiro sem argumentos e o outro que recebe numerador e denominador da fração; b) uma função-membro que retorna o numerador e outra que retorna o denominador; c) as operações de adição, subtração, multiplicação e divisão; d ) as operações de incremento e decremento pré-fixadas; e) um conversor de tipo que converte um objeto fração para um tipo float;