330 likes | 449 Views
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.
E N D
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ópicos 8.1 Sobrecarga de Operadores 8.2 Função friend 8.3 Operador this
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?
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;
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.
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)
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(); };
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; }
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)
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
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
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);
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);
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);
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?
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
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!!!
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!!!
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) { //… }
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
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
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)
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
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; }
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;
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
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
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; }
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 >>
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
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;
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
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