1 / 33

Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

Técnicas de Programação. Sobrecarga. de Operadores II. Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com. Carga Horária: 60 horas. Revisão. Tó p icos 8.1 Sobrecarga de Operadores 8.2 Função friend 8.3 Operador this. Sobrecarga de Operadores I.

pearly
Download Presentation

Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Técnicas de Programação Sobrecarga de Operadores II Prof.:José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com Carga Horária:60 horas

  2. Revisão Tópicos 8.1 Sobrecarga de Operadores 8.2 Função friend 8.3 Operador this

  3. Sobrecarga de Operadores I • Uso de alguns símbolos de operadores  Definição de funções-membros especiais de uma classe • Possibilidade de formulação de notações convenientes para comportamentos de objetos Por que?

  4. Sobrecarga de Operadores II • Por que? • Possibilidade de tornar uma operação sobre objetos parecer como uma operação default (e.g. operação sobre tipos int) a partir do uso de funções operadoras Complexo a,b,c; c = a + b;

  5. Sobrecarga de Operadores II • Por que? int i, j, k; // declaracao de inteiros float m, n, p; // declaracao de variaveis de ponto flutuante k = i + j; // adicao e atribuicao de inteiros p = m + n; // adicao e atribuicao de inteiros de variaveis // de ponto flutuante Sobrecarga do operador + por default pelo compilador para as operações de adição de tipos integer e float.

  6. Sobrecarga de Operadores III • Sintaxe operator@(lista_de_argumentos) Exemplos: operator+ operator- operator* operator/ Símbolo de operador C++ passível de sobrecarga Função (membro ou não da classe)

  7. Sobrecarga de Operadores IV • Exemplo 01 1/4 class CStr { char *pDado; int nComp; public: // … void cat(char *s); // … CStr operator+(CStr str1, CStr str2); CStr operator+(CStr str, char *s); CStr operator+(char *s, CStr str); //Funcoes de acesso char* le_Dado(); int le_Comp(); };

  8. Sobrecarga de Operadores V • Exemplo 01 2/4 void CStr::concat(char *s) { int n; char *pTemp; n=strlen(s); if(n==0) return; pTemp = new char[n+nComp+1]; if(pDado) strcpy(pTemp,pDado); strcat(pTemp,s); pDado=pTemp; nComp+=n; }

  9. Sobrecarga de Operadores VI • Exemplo 01 3/4 CStr CStr::operator+(CStr str1, CStr str2) { CStr new_string(str1); //chamada do construtor de copia para // inicializacao de um novo objeto CStr com o primeiro operando new_string.concat(str2.get_Dado()); //concatenacao do segundo //operando ao final de new_string return new_string; //chamada do construtor de copia para a criacao de uma copia do novo valor de retorno new_string } new_string strcat(str1,str2) strlen(str1)+strlen(str2) str1 strlen(str1)

  10. Sobrecarga de Operadores VII • Exemplo 01 4/4 CStr primeiro(“Circuitos”); CStr ultimo(“Lógicos”); CStr nome(primeiro+ultimo); CStr CStr::operator+(CStr str1,CStr str2) { CStr new_string(str1); new_string.concat(str2.get()); return new_string; } “Circuitos Lógicos” nome Construtor de Cópia Objeto temporário CStr

  11. Sobrecarga de Operadores VIII • Implementação I • Como funções-membros • Como funções não membros ou amigas (friend) • Função operadora  Necessidade de declaração como uma friend se for necessário o acesso a dados protected ou private • Tradução da expressão obj1@obj2 • obj1.operator@(obj2) Se a função for definida dentro da classe obj1 • operator@(obj1,obj2) Se a função for definida fora da classe obj1

  12. Sobrecarga de Operadores VIII • Implementação II – Exemplo 02 • Definição como uma função-membro class Complex { ... public: ... Complex operator+(const Complex &op) { double real = _real + op._real, imag = _imag + op._imag; return(Complex(real, imag)); } ... }; c = a+b; c =a.operator+(b);

  13. Sobrecarga de Operadores IX • Implementação III – Exemplo 03 • Definição como uma funçãonão membro class Complex { ... public: ... double real(){return _real;} // funcoes de acesso necessarias double imag(){ return _imag; } ... }; Complex operator+(Complex &op1, Complex &op2) { double real = op1.real() + op2.real(), imag = op1.imag() + op2.imag(); return(Complex(real, imag)); } c = a+b; c =operator+(a, b);

  14. Sobrecarga de Operadores IX • Implementação IV – Exemplo 04 • Definição como uma funçãofriend class Complex { ... public: ... friend Complex operator +(const Complex &, const Complex & ); … }; Complex operator+(Complex &op1, Complex &op2) { double real = op1.real() + op2.real(), imag = op1.imag() + op2.imag(); return(Complex(real, imag)); } c = a+b; c =operator+(a, b);

  15. Sobrecarga de Operadores X • Funções-membros comuns, Funções Estáticas e Funções Amigas • Parte private da definição da classe passível de acesso pela função • Inclusão da função no escopo da classe • Invocação da função em um objeto Quaisdas 3 afirmações são verdadeiras sobre as diferentes funções?

  16. Sobrecarga de Operadores XI • Funções Amigas • Introdução de acoplamento extra antre classes via declarações friend • Declaração de um objeto as friend  Acesso a todos os membros não públicos como se assim o fossem • Acesso unidirecional • Se Obj1 for designado como friend de Obj2 Possibilidade de acesso membros não públicos de Obj2 por Obj1, mas não o contrário • Definição feita fora do escopo da classe que a considerar como amiga

  17. Sobrecarga de Operadores XII • Aplicações de Funções Amigas I • Principais • Possibilidade de acesso mais eficiente a membros de dados do que than the function call • Acomodação de funções operadoras com facilidade de acesso a membros não públicos de dados • Recomendação I • Uso cauteloso de funções amigas  Acesso irrestrito a membros não públicos de dados pode impactar sobre a ocultação dos dados!!!

  18. Sobrecarga de Operadores XIII • Aplicações de Funções Amigas II • Recomendação II • Permissão para alteração do estado interno de um objeto de fora da classe Preferência do uso de funções-membros da classe para fazê-lo, ao invés de funções amigas!!!

  19. Sobrecarga de Operadores XIV • Operador de Atribuição • Suporte entre objetos do mesmo tipo • Provimento de uma função “oculta” de atribuição pelo compilador se o programador não escrever uma • Idem para o construtor de cópia • Sintaxe class& class::operator=(const class &arg) { //… }

  20. Sobrecarga de Operadores XV • Exemplo 05 – Atribuição para a classe CStr CStr& CStr::operator=(const CStr &source){ //Faz a copia return *this; } CStr& CStr::operator=(const CStr & source) Retorno de uma referência para (o endereço de) um objeto CStr Tipo de argumento - referência para um objeto CStr (o qual, por ser const, não pode ser modificado pela função) Função de atribuição chamada como uma função-membro do operando da esquerda  Retorno do próprio objeto str1=str2; str1.operator=(str2) Atribuição da cópia ≠ Construtor de cópia

  21. Sobrecarga de Operadores XVI • Apontador this I • No contexto de uma função-membro  Apontador para o objeto atual (aquele através do qual a função foi invocada) • Passagem de this oculto por C++  Sempreque uma função-membro for invocada • No contexto da definição de uma função-membro  Existência de um uso implícito de this para referência aos membros de dados

  22. Sobrecarga de Operadores XVII • Apontador this II this Referência ao membro de Dados Equivalente a pDado this->pDado nTam this->nTam pDado nTam ObjetoCStr (*this)

  23. Sobrecarga de Operadores XVIII • Sobrecarga dos Operadores de Inserção e Extração de Stream I • Objeto cout • Representante do stream de saída em C++ • Relacionado ao fluxo de dados a serem impressos na tela • Operador de Inserção << • Operador << sobrecarregado para a execução da saída (impressão em tela) a partir de streams • Objeto cout usado em conjunto com << para a impressão de dados

  24. Sobrecarga de Operadores XIX • Sobrecarga dos Operadores de Inserção e Extração de Stream II #include <iostream> using namespace std; int main() { cout << “Teste com um cout\n"; // impressao de uma linha a partir de multiplos comandos cout << "Teste com "; cout << "dois couts\n"; // uso do manipulador endl, geracao de caractere de nova // linha e esvaziamento do buffer de saída cout << “Teste com endl..." << endl; cout << “... e flush \n"; cout << flush; // esvaziamento do buffer de saída, sem //geracao de nova linha return 0; }

  25. Sobrecarga de Operadores XX • Sobrecarga dos Operadores de Inserção e Extração de Stream III • Retorno de uma referência ao objeto cout por << Possibilidade de encadeamento de vários cout e de combinação de constantes e variáveis intx = 1, y = 2; // impressao de uma string e o resultado da soma entre as variaveis x e y cout << "Encadeamento de saidas – Soma de dois números " << x + y << endl;

  26. Sobrecarga de Operadores XXI • Sobrecarga dos Operadores de Inserção e Extração de Stream IV • Alternativa para a apresentação de caracteres em tela sem o uso do operador de inserção << • Uso da função-membro put cout.put('caractere');//saida de um único // caractere cout.put('caractere').put('\n');//saída encadeada

  27. Sobrecarga de Operadores XXII • Sobrecarga dos Operadores de Inserção e Extração de Stream V • Objeto cin • Representante do stream de entrada em C++ • Relacionado ao fluxo de dados a serem capturados sem espaços e sem tabulações, vindos do teclado • Operador de Extração >> • Operador >> sobrecarregado para a execução da entrada de streams • Objeto cin usado em conjunto com >> para a aquisição de dados do teclado

  28. Sobrecarga de Operadores XXIII • Sobrecarga dos Operadores de Inserção e Extração de Stream VI #include <iostream> using namespace std; int main() { int n1,n2; cout << “Captura do primeiro valor: "; cin >> n1; cout << endl; cout << “Captura do segundo valor: "; cin >> n2; cout << endl; return 0; }

  29. Sobrecarga de Operadores XXIV • Sobrecarga dos Operadores de Inserção e Extração de Stream VII • Síntese • cout<< e cin>> Sobrecargas de operadores disponíveis na biblioteca padrão iostream da linguagem C++ • cout e cin Objetos das classes ostream e istream, respectivamente • Possibilidade de inclusão de funções amigas para a sobrecarga dos operadores<< e >>

  30. Sobrecarga de Operadores XXV • Sobrecarga dos Operadores de Inserção e Extração de Stream VIII • Exemplo 06 friend ostream& operator<< (ostream &sai, const Date &d); ostream& operator<<(ostream &sai, const Data &d) { sai<<d.mes<<“/”<<d.dia<<“/”<<d.ano; return sai; } … cout<< d1; // operador sobrecarregado cout objeto de ostream

  31. Sobrecarga de Operadores XXVI • Sobrecarga dos Operadores de Inserção e Extração de Stream IX • Exemplo 08 – Inclusão de uma função amiga para sobrecarga de >> friend istream& operator>> (istream &entra, Data &d); istream& operator>> (istream &entra, Data &d) { char mmddaa[9]; entra >> mmddaa; // verificacao de validade dos dados if (d.set(mmddaa)) return entra; cout<< " Formato invalido da data : "<<d<<endl; exit(-1); } cin objeto de istream cin >> d1;

  32. Sobrecarga de Operadores XXVII • Síntese • Possibilidade de formulação de notações convenientes para comportamentos de objetos • Possibilidades de implementação • Via funções-membros • Via funções não membros típicas • Via funções amigas

  33. José Eustáquio Rangel de Queiroz UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE ENGENHARIA ELÉTRICA E INFORMÁTICA rangel@dsc.ufcg.edu.br DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

More Related