{joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG Prof.: José Eustáquio Rangel de Queiroz [email protected] [email protected] Carga Horária: 60 horas Revisão DSC/CCT/UFCG Tópicos {joseana, rangel}@dsc.ufcg.edu.br 8.1 8.2 8.3 Sobrecarga de Operadores Função friend Operador this Sobrecarga de Operadores I {joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG 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? 3 Sobrecarga de Operadores II DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br Complexo a,b,c; c = a + b; 4 Sobrecarga de Operadores II DSC/CCT/UFCG Por que? int i, j, k; // declaracao de inteiros float m, n, p; // declaracao de variaveis de ponto flutuante {joseana, rangel}@dsc.ufcg.edu.br 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. 5 Sobrecarga de Operadores III DSC/CCT/UFCG Sintaxe operator@(lista_de_argumentos) Símbolo de operador C++ passível de sobrecarga {joseana, rangel}@dsc.ufcg.edu.br Função (membro ou não da classe) Exemplos: operator+ operatoroperator* operator/ 6 Sobrecarga de Operadores IV DSC/CCT/UFCG Exemplo 01 1/4 {joseana, rangel}@dsc.ufcg.edu.br 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(); }; 7 Sobrecarga de Operadores V DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br 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; } 8 Sobrecarga de Operadores VI DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br new_string strcat(str1,str2) strlen(str1)+strlen(str2) str1 strlen(str1) 9 Sobrecarga de Operadores VII DSC/CCT/UFCG Exemplo 01 4/4 CStr primeiro(“Circuitos”); CStr ultimo(“Lógicos”); CStr nome(primeiro+ultimo); {joseana, rangel}@dsc.ufcg.edu.br CStr CStr::operator+(CStr str1,CStr str2) { CStr new_string(str1); new_string.concat(str2.get()); return new_string; } nome Construtor de Cópia “Circuitos Lógicos” Objeto temporário CStr 10 Sobrecarga de Operadores VIII DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br 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 11 Sobrecarga de Operadores VIII DSC/CCT/UFCG Implementação II – Exemplo 02 {joseana, rangel}@dsc.ufcg.edu.br 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); 12 Sobrecarga de Operadores IX DSC/CCT/UFCG Implementação III – Exemplo 03 Definição como uma função não membro {joseana, rangel}@dsc.ufcg.edu.br 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); 13 Sobrecarga de Operadores IX DSC/CCT/UFCG Implementação IV – Exemplo 04 Definição como uma função friend class Complex { ... public: ... friend Complex operator +(const Complex &, const Complex & ); {joseana, rangel}@dsc.ufcg.edu.br … }; 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 X DSC/CCT/UFCG Funções-membros comuns, Estáticas e Funções Amigas Parte private da definição passível de acesso pela função Funções da classe Inclusão da função no escopo da classe {joseana, rangel}@dsc.ufcg.edu.br Invocação da função em um objeto Quais das 3 afirmações são verdadeiras sobre as diferentes funções? 15 Sobrecarga de Operadores XI DSC/CCT/UFCG Funções Amigas Introdução de acoplamento extra antre classes via declarações friend de um objeto as friend Acesso a todos os membros não públicos como se assim o fossem Declaração Acesso unidirecional {joseana, rangel}@dsc.ufcg.edu.br 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 16 Sobrecarga de Operadores XII DSC/CCT/UFCG Aplicações de Funções Amigas I {joseana, rangel}@dsc.ufcg.edu.br 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!!! 17 Sobrecarga de Operadores XIII DSC/CCT/UFCG Aplicações de Funções Amigas II Recomendação II {joseana, rangel}@dsc.ufcg.edu.br 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!!! 18 Sobrecarga de Operadores XIV DSC/CCT/UFCG Operador de Atribuição Suporte entre objetos do mesmo tipo Provimento de uma função “oculta” de atribuição pelo compilador programador não escrever uma se o Idem para o construtor de cópia {joseana, rangel}@dsc.ufcg.edu.br Sintaxe class& class::operator=(const class &arg) { //… } 19 Sobrecarga de Operadores XV DSC/CCT/UFCG Exemplo 05 – Atribuição para a classe CStr CStr& CStr::operator=(const CStr & source) {joseana, rangel}@dsc.ufcg.edu.br 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) CStr& CStr::operator=(const CStr &source){ //Faz a copia Função de atribuição chamada return *this; como uma função-membro do operando da esquerda } str1=str2; Retorno do próprio objeto str1.operator=(str2) Atribuição da cópia ≠ Construtor de cópia 20 Sobrecarga de Operadores XVI DSC/CCT/UFCG 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) de this que uma Passagem Sempre invocada oculto por C++ função-membro for {joseana, rangel}@dsc.ufcg.edu.br 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 21 Sobrecarga de Operadores XVII DSC/CCT/UFCG Apontador this II Referência ao membro de Dados this pDado {joseana, rangel}@dsc.ufcg.edu.br nTam Equivalente a pDado this->pDado nTam this->nTam Objeto CStr (*this) 22 Sobrecarga de Operadores XVIII DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br 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 23 Sobrecarga de Operadores XIX DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br 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; } 24 Sobrecarga de Operadores XX DSC/CCT/UFCG Sobrecarga dos Operadores de Inserção e Extração de Stream III Retorno de uma referência ao objeto cout {joseana, rangel}@dsc.ufcg.edu.br por << Possibilidade de encadeamento de vários cout e de combinação de constantes e variáveis int x = 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; 25 Sobrecarga de Operadores XXI DSC/CCT/UFCG 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 << {joseana, rangel}@dsc.ufcg.edu.br Uso da função-membro put cout.put('caractere');//saida de um único // caractere cout.put('caractere').put('\n');//saída encadeada 26 Sobrecarga de Operadores XXII DSC/CCT/UFCG Sobrecarga dos Operadores de Inserção e Extração de Stream V Objeto cin Representante do stream de entrada em C++ {joseana, rangel}@dsc.ufcg.edu.br Relacionado ao fluxo de dados a serem capturados sem espaços e sem tabulações, vindos do teclado Operador de Extração >> Operador >> sobrecarregado execução da entrada de streams Objeto cin usado em conjunto com >> para a aquisição de dados do teclado para a 27 Sobrecarga de Operadores XXIII DSC/CCT/UFCG {joseana, rangel}@dsc.ufcg.edu.br 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; } 28 Sobrecarga de Operadores XXIV DSC/CCT/UFCG 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 {joseana, rangel}@dsc.ufcg.edu.br istream, respectivamente Possibilidade de inclusão de funções amigas para a sobrecarga dos operadores << e >> 29 Sobrecarga de Operadores XXV DSC/CCT/UFCG Sobrecarga dos Operadores de Inserção e Extração de Stream VIII Exemplo 06 {joseana, rangel}@dsc.ufcg.edu.br 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 30 Sobrecarga de Operadores XXVI DSC/CCT/UFCG 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); {joseana, rangel}@dsc.ufcg.edu.br istream& operator>> (istream &entra, Data &d) { char mmddaa[9]; entra >> mmddaa; cin objeto de istream // verificacao de validade dos dados if (d.set(mmddaa)) return entra; cout<< " Formato invalido da data : "<<d<<endl; exit(-1); cin >> d1; } 31 Sobrecarga de Operadores XXVII DSC/CCT/UFCG Síntese Possibilidade de formulação de notações convenientes objetos para comportamentos de {joseana, rangel}@dsc.ufcg.edu.br Possibilidades de implementação Via funções-membros Via funções não membros típicas Via funções amigas 32 DSC/CCT/UFCG José Eustáquio Rangel de Queiroz [email protected] {joseana, rangel}@dsc.ufcg.edu.br UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE ENGENHARIA ELÉTRICA E INFORMÁTICA DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO