Prof.: José Eustáquio Rangel de Queiroz [email protected] rangeldequeiroz@gmail

33
{joseana, rangel}@dsc.ufcg.edu.br DSC/CCT/UFCG Carga Horária: Carga Horária: 60 horas 60 horas Prof.: Prof.: José Eustáquio Rangel de Queiroz José Eustáquio Rangel de Queiroz [email protected] [email protected] [email protected] [email protected]

description

Técnicas de Programação. Sobrecarga. de Operadores II. Prof.: José Eustáquio Rangel de Queiroz [email protected] [email protected]. Carga Horária: 60 horas. Revisão. Tó p icos 8.1 Sobrecarga de Operadores 8.2Função friend 8.3Operador this. Sobrecarga de Operadores I. - PowerPoint PPT Presentation

Transcript of Prof.: José Eustáquio Rangel de Queiroz [email protected] rangeldequeiroz@gmail

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

{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Carga Horária:Carga Horária: 60 horas60 horasCarga Horária:Carga Horária: 60 horas60 horas

Prof.:Prof.: José Eustáquio Rangel de José Eustáquio Rangel de QueirozQueiroz

[email protected]@[email protected]@gmail.com

Prof.:Prof.: José Eustáquio Rangel de José Eustáquio Rangel de QueirozQueiroz

[email protected]@[email protected]@gmail.com

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

{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Tópicos

8.1 Sobrecarga de Operadores8.2 Função friend8.3 Operador this

Tópicos

8.1 Sobrecarga de Operadores8.2 Função friend8.3 Operador this

RevisãoRevisão

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

3{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga de Operadores ISobrecarga de Operadores I

Uso de alguns símbolos de operadores Uso de alguns símbolos de operadores Definição de funções-membros especiais Definição de funções-membros especiais de uma classede uma classe

Possibilidade de formulação de notações Possibilidade de formulação de notações convenientes para comportamentos de convenientes para comportamentos de objetosobjetos

Uso de alguns símbolos de operadores Uso de alguns símbolos de operadores Definição de funções-membros especiais Definição de funções-membros especiais de uma classede uma classe

Possibilidade de formulação de notações Possibilidade de formulação de notações convenientes para comportamentos de convenientes para comportamentos de objetosobjetos

Por quePor que??Por quePor que??

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

4{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Por que?Por que?

Possibilidade de tornar uma operação Possibilidade de tornar uma operação sobre objetos parecer como uma operação sobre objetos parecer como uma operação defaultdefault (e.g. operação sobre tipos (e.g. operação sobre tipos intint) a ) a partir do uso de funções operadoraspartir do uso de funções operadoras

ComplexoComplexo a,b,c; a,b,c;c = a + b;c = a + b;

Por que?Por que?

Possibilidade de tornar uma operação Possibilidade de tornar uma operação sobre objetos parecer como uma operação sobre objetos parecer como uma operação defaultdefault (e.g. operação sobre tipos (e.g. operação sobre tipos intint) a ) a partir do uso de funções operadoraspartir do uso de funções operadoras

ComplexoComplexo a,b,c; a,b,c;c = a + b;c = a + b;

Sobrecarga de Operadores IISobrecarga de Operadores II

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

5{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Por que?Por que? Por que?Por que?

intint i, j, k; i, j, k; // declaracao de inteiros// declaracao de inteirosfloatfloat m, n, p; m, n, p; // declaracao de variaveis de ponto flutuante// declaracao de variaveis de ponto flutuante

k = i k = i ++ j; j; // adicao e atribuicao de inteiros// adicao e atribuicao de inteirosp = m p = m ++ n; n; // adicao e atribuicao de inteiros de variaveis // adicao e atribuicao de inteiros de variaveis

// de ponto flutuante // 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 IISobrecarga de Operadores II

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

6{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

SintaxeSintaxe

operator@(lista_de_argumentos)

Função (membro ou não da classe)

Símbolo de operador C++passível de sobrecarga

Exemplos:

operator+

operator-

operator*

operator/

Sobrecarga de Operadores IIISobrecarga de Operadores III

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

7{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

classclass CStr CStr {{

charchar *pDado; *pDado;intint nComp; nComp;

publicpublic::// …// …voidvoid cat(char *s); cat(char *s);// …// …

CStr CStr operatoroperator++(CStr str1, CStr str2);(CStr str1, CStr str2);CStr CStr operatoroperator++(CStr str, char *s);(CStr str, char *s);CStrCStr operator operator++(char *s, CStr str);(char *s, CStr str);

//Funcoes de acesso//Funcoes de acessochar* le_Dado();char* le_Dado();

int le_Comp(); int le_Comp();

};};

classclass CStr CStr {{

charchar *pDado; *pDado;intint nComp; nComp;

publicpublic::// …// …voidvoid cat(char *s); cat(char *s);// …// …

CStr CStr operatoroperator++(CStr str1, CStr str2);(CStr str1, CStr str2);CStr CStr operatoroperator++(CStr str, char *s);(CStr str, char *s);CStrCStr operator operator++(char *s, CStr str);(char *s, CStr str);

//Funcoes de acesso//Funcoes de acessochar* le_Dado();char* le_Dado();

int le_Comp(); int le_Comp();

};};

Sobrecarga de Operadores IVSobrecarga de Operadores IV

Exemplo 01 Exemplo 01 11/4/4

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

8{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

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 VSobrecarga de Operadores V

Exemplo 01 Exemplo 01 22/4/4

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

9{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga de Operadores VISobrecarga de Operadores VI

Exemplo 01 Exemplo 01 33/4/4CStr CStrCStr CStr::operator::operator++(CStr str1, CStr str2)(CStr str1, CStr str2){{ CStr new_string(str1); CStr new_string(str1); //chamada do construtor de copia para // //chamada do construtor de copia para //

inicializacao de um novo objeto CStr com o primeiro operandoinicializacao de um novo objeto CStr com o primeiro operando new_string.concat(str2.get_Dado()); new_string.concat(str2.get_Dado()); //concatenacao do segundo //concatenacao do segundo

//operando ao final de new_string//operando ao final de new_string returnreturn new_string; new_string; //chamada //chamada do construtor de copia do construtor de copia para a para a

criacao de uma copia do novo valor de retorno new_stringcriacao de uma copia do novo valor de retorno new_string}}

CStr CStrCStr CStr::operator::operator++(CStr str1, CStr str2)(CStr str1, CStr str2){{ CStr new_string(str1); CStr new_string(str1); //chamada do construtor de copia para // //chamada do construtor de copia para //

inicializacao de um novo objeto CStr com o primeiro operandoinicializacao de um novo objeto CStr com o primeiro operando new_string.concat(str2.get_Dado()); new_string.concat(str2.get_Dado()); //concatenacao do segundo //concatenacao do segundo

//operando ao final de new_string//operando ao final de new_string returnreturn new_string; new_string; //chamada //chamada do construtor de copia do construtor de copia para a para a

criacao de uma copia do novo valor de retorno new_stringcriacao de uma copia do novo valor de retorno new_string}}

new_string

strcat(str1,str2)strcat(str1,str2)strlen(str1)+strlen(str2)strlen(str1)+strlen(str2)

str1str1strlen(str1)strlen(str1)

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

10{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Exemplo 01 Exemplo 01 44/4/4CStr primeiro(“Circuitos”);CStr primeiro(“Circuitos”);CStr ultimo(“Lógicos”);CStr ultimo(“Lógicos”);CStr nome(primeiro+ultimo);CStr nome(primeiro+ultimo);

CStr primeiro(“Circuitos”);CStr primeiro(“Circuitos”);CStr ultimo(“Lógicos”);CStr ultimo(“Lógicos”);CStr nome(primeiro+ultimo);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”

Objeto temporário CStrConstrutor Construtor de Cópiade Cópia

nomenome

Sobrecarga de Operadores VII

Sobrecarga de Operadores VII

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

11{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Implementação IImplementação I

Como Como funções-membrosfunções-membros

Como Como funções não membrosfunções não membros ou ou amigasamigas ((friendfriend))

Função operadora Função operadora Necessidade de Necessidade de declaração como uma declaração como uma friendfriend se for se for necessário o acesso a dados necessário o acesso a dados protectedprotected ou ou privateprivate

Tradução da expressão Tradução da expressão obj1@obj2obj1@obj2 obj1.operator@(obj2)obj1.operator@(obj2) Se a função for Se a função for

definida definida dentrodentro da classe da classe obj1obj1 operator@(obj1,obj2)operator@(obj1,obj2) Se a função for Se a função for

definida definida forafora da classe da classe obj1obj1

Implementação IImplementação I

Como Como funções-membrosfunções-membros

Como Como funções não membrosfunções não membros ou ou amigasamigas ((friendfriend))

Função operadora Função operadora Necessidade de Necessidade de declaração como uma declaração como uma friendfriend se for se for necessário o acesso a dados necessário o acesso a dados protectedprotected ou ou privateprivate

Tradução da expressão Tradução da expressão obj1@obj2obj1@obj2 obj1.operator@(obj2)obj1.operator@(obj2) Se a função for Se a função for

definida definida dentrodentro da classe da classe obj1obj1 operator@(obj1,obj2)operator@(obj1,obj2) Se a função for Se a função for

definida definida forafora da classe da classe obj1obj1

Sobrecarga de Operadores VIII

Sobrecarga de Operadores VIII

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

12{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

classclass Complex { Complex { ...... publicpublic:: ...... Complex Complex operatoroperator++((constconst Complex &op) Complex &op) {{ doubledouble real = _real + op._real, real = _real + op._real, imag = _imag + op._imag;imag = _imag + op._imag; returnreturn(Complex(real, imag));(Complex(real, imag)); }} ...... };};

c = a+b; c = a.operator+ (b);

Implementação II – Exemplo 02Implementação II – Exemplo 02

Definição como uma Definição como uma funfunçção-membroão-membro

Implementação II – Exemplo 02Implementação II – Exemplo 02

Definição como uma Definição como uma funfunçção-membroão-membro

Sobrecarga de Operadores VIII

Sobrecarga de Operadores VIII

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

13{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

classclass Complex { Complex { ...... publicpublic:: ...... doubledouble real(){ real(){returnreturn _real;} _real;} // funcoes de acesso necessarias// funcoes de acesso necessarias doubledouble imag(){ imag(){ returnreturn _imag; } _imag; }...... };};

c = a+b; c = operator+ (a, b);

Implementação III – Exemplo 03Implementação III – Exemplo 03

Definição como uma Definição como uma funfunççãoão não membronão membro

Implementação III – Exemplo 03Implementação III – Exemplo 03

Definição como uma Definição como uma funfunççãoão não membronão membro

Sobrecarga de Operadores IXSobrecarga de Operadores IX

Complex Complex operatoroperator++(Complex &op1, Complex &op2) (Complex &op1, Complex &op2) {{ doubledouble real = op1.real() + op2.real(), imag = op1.imag() + real = op1.real() + op2.real(), imag = op1.imag() +

op2.imag();op2.imag(); returnreturn(Complex(real, imag));(Complex(real, imag));}}

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

14{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

classclass Complex { Complex { ...... publicpublic:: ...... friendfriend Complex operator +(const Complex &, const Complex & ); Complex operator +(const Complex &, const Complex & ); … … };};

c = a+b; c = operator+ (a, b);

Implementação IV – Exemplo 04Implementação IV – Exemplo 04

Definição como uma Definição como uma funfunççãoão friendfriend

Implementação IV – Exemplo 04Implementação IV – Exemplo 04

Definição como uma Definição como uma funfunççãoão friendfriend

Sobrecarga de Operadores IXSobrecarga de Operadores IX

Complex Complex operatoroperator++(Complex &op1, Complex &op2) (Complex &op1, Complex &op2) {{ doubledouble real = op1.real() + op2.real(), imag = op1.imag() + real = op1.real() + op2.real(), imag = op1.imag() +

op2.imag();op2.imag(); returnreturn(Complex(real, imag));(Complex(real, imag));}}

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

15{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Funções-membros comuns, Funções Funções-membros comuns, Funções Estáticas e Funções AmigasEstáticas e Funções Amigas

Parte Parte privateprivate da definição da classe da definição da classe passível de acesso pela funçãopassível de acesso pela função

Inclusão da função no escopo da classeInclusão da função no escopo da classe

Invocação da função em um objetoInvocação da função em um objeto

Funções-membros comuns, Funções Funções-membros comuns, Funções Estáticas e Funções AmigasEstáticas e Funções Amigas

Parte Parte privateprivate da definição da classe da definição da classe passível de acesso pela funçãopassível de acesso pela função

Inclusão da função no escopo da classeInclusão da função no escopo da classe

Invocação da função em um objetoInvocação da função em um objeto

Sobrecarga de Operadores XSobrecarga de Operadores X

QQuaisuais das 3 afirmações das 3 afirmações são são verdadeirasverdadeiras sobre sobre as diferentes funções?as diferentes funções?

QQuaisuais das 3 afirmações das 3 afirmações são são verdadeirasverdadeiras sobre sobre as diferentes funções?as diferentes funções?

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

16{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Funções AmigasFunções Amigas Introdução de acoplamento extra antre Introdução de acoplamento extra antre

classes via declarações classes via declarações friendfriend

Declaração de um objeto as Declaração de um objeto as friend friend Acesso a Acesso a todostodos os membros não públicos os membros não públicos como se assim o fossemcomo se assim o fossem

Acesso Acesso unidirecionalunidirecional Se Se Obj1Obj1 for designado como for designado como friendfriend de de Obj2Obj2

Possibilidade de acesso membros não Possibilidade de acesso membros não públicos de públicos de Obj2Obj2 por por Obj1Obj1, mas , mas nãonão o o contráriocontrário

Definição feita Definição feita forafora do escopo da classe do escopo da classe que a considerar como amigaque a considerar como amiga

Funções AmigasFunções Amigas Introdução de acoplamento extra antre Introdução de acoplamento extra antre

classes via declarações classes via declarações friendfriend

Declaração de um objeto as Declaração de um objeto as friend friend Acesso a Acesso a todostodos os membros não públicos os membros não públicos como se assim o fossemcomo se assim o fossem

Acesso Acesso unidirecionalunidirecional Se Se Obj1Obj1 for designado como for designado como friendfriend de de Obj2Obj2

Possibilidade de acesso membros não Possibilidade de acesso membros não públicos de públicos de Obj2Obj2 por por Obj1Obj1, mas , mas nãonão o o contráriocontrário

Definição feita Definição feita forafora do escopo da classe do escopo da classe que a considerar como amigaque a considerar como amiga

Sobrecarga de Operadores XISobrecarga de Operadores XI

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

17{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Aplicações de Funções Amigas IAplicações de Funções Amigas I PrincipaisPrincipais

Possibilidade de acesso mais eficiente a Possibilidade de acesso mais eficiente a membros de dados do que than the membros de dados do que than the function callfunction call

Acomodação de funções operadoras com Acomodação de funções operadoras com facilidade de acesso a membros não facilidade de acesso a membros não públicos de dadospúblicos de dados

Recomendação IRecomendação I Uso cauteloso de funções amigas Uso cauteloso de funções amigas Acesso Acesso

irrestrito a membros não públicos de irrestrito a membros não públicos de dados pode impactar sobre a ocultação dos dados pode impactar sobre a ocultação dos dados!!!dados!!!

Aplicações de Funções Amigas IAplicações de Funções Amigas I PrincipaisPrincipais

Possibilidade de acesso mais eficiente a Possibilidade de acesso mais eficiente a membros de dados do que than the membros de dados do que than the function callfunction call

Acomodação de funções operadoras com Acomodação de funções operadoras com facilidade de acesso a membros não facilidade de acesso a membros não públicos de dadospúblicos de dados

Recomendação IRecomendação I Uso cauteloso de funções amigas Uso cauteloso de funções amigas Acesso Acesso

irrestrito a membros não públicos de irrestrito a membros não públicos de dados pode impactar sobre a ocultação dos dados pode impactar sobre a ocultação dos dados!!!dados!!!

Sobrecarga de Operadores XII

Sobrecarga de Operadores XII

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

18{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Aplicações de Funções Amigas IIAplicações de Funções Amigas II Recomendação IIRecomendação II

Permissão para alteração do estado Permissão para alteração do estado interno de um objeto de interno de um objeto de forafora da classe da classe Preferência do uso de funções-membros da Preferência do uso de funções-membros da classe para fazê-lo, ao invés de funções classe para fazê-lo, ao invés de funções amigas!!!amigas!!!

Aplicações de Funções Amigas IIAplicações de Funções Amigas II Recomendação IIRecomendação II

Permissão para alteração do estado Permissão para alteração do estado interno de um objeto de interno de um objeto de forafora da classe da classe Preferência do uso de funções-membros da Preferência do uso de funções-membros da classe para fazê-lo, ao invés de funções classe para fazê-lo, ao invés de funções amigas!!!amigas!!!

Sobrecarga de Operadores XIII

Sobrecarga de Operadores XIII

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

19{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Operador de AtribuiçãoOperador de Atribuição Suporte entre objetos do Suporte entre objetos do mesmomesmo tipo tipo

Provimento de uma função “oculta” de Provimento de uma função “oculta” de atribuição pelo compilador se o atribuição pelo compilador se o programador não escrever umaprogramador não escrever uma

Idem para o Idem para o construtor de cópiaconstrutor de cópia

Sintaxe Sintaxe

class& class::operator=(const class class& class::operator=(const class &arg) &arg)

{{ //…//…

}}

Operador de AtribuiçãoOperador de Atribuição Suporte entre objetos do Suporte entre objetos do mesmomesmo tipo tipo

Provimento de uma função “oculta” de Provimento de uma função “oculta” de atribuição pelo compilador se o atribuição pelo compilador se o programador não escrever umaprogramador não escrever uma

Idem para o Idem para o construtor de cópiaconstrutor de cópia

Sintaxe Sintaxe

class& class::operator=(const class class& class::operator=(const class &arg) &arg)

{{ //…//…

}}

Sobrecarga de Operadores XIV

Sobrecarga de Operadores XIV

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

20{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Exemplo 05 – Atribuição para a classe Exemplo 05 – Atribuição para a classe CStrCStr Exemplo 05 – Atribuição para a classe Exemplo 05 – Atribuição para a classe CStrCStr

Sobrecarga de Operadores XV

Sobrecarga de Operadores XV

CStr& CStr::operator=(const CStr &source){CStr& CStr::operator=(const CStr &source){//Faz a copia//Faz a copiareturn *this;return *this;}}

CStr& CStr::operator=(const CStr &source){CStr& CStr::operator=(const CStr &source){//Faz a copia//Faz a copiareturn *this;return *this;}}

Retorno de uma referência para (o endereço de) um objeto CStrCStr

Tipo de argumento - referência para um objeto CStrCStr (o qual, por ser constconst, nãonão pode ser modificado pela função)

str1=str2;

str1.operator=(str2)Atribuição da cópia ≠ Construtor de cópia

CStr& CStr::operator=(const CStr & source)

Função de atribuição chamada como uma função-membro do operando da esquerda Retorno do próprio objeto

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

21{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Apontador Apontador this this I I No contexto de uma função-membro No contexto de uma função-membro

Apontador para o objeto atual (aquele Apontador para o objeto atual (aquele através do qual a função foi invocada)através do qual a função foi invocada)

Passagem de Passagem de thisthis oculto por C++ oculto por C++ SemSempprere que uma função-membro for que uma função-membro for invocadainvocada

No contexto da definição de uma função-No contexto da definição de uma função-membro membro Existência de um uso implícito Existência de um uso implícito de de thisthis para referência aos membros de para referência aos membros de dadosdados

Apontador Apontador this this I I No contexto de uma função-membro No contexto de uma função-membro

Apontador para o objeto atual (aquele Apontador para o objeto atual (aquele através do qual a função foi invocada)através do qual a função foi invocada)

Passagem de Passagem de thisthis oculto por C++ oculto por C++ SemSempprere que uma função-membro for que uma função-membro for invocadainvocada

No contexto da definição de uma função-No contexto da definição de uma função-membro membro Existência de um uso implícito Existência de um uso implícito de de thisthis para referência aos membros de para referência aos membros de dadosdados

Sobrecarga de Operadores XVI

Sobrecarga de Operadores XVI

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

22{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Apontador Apontador this this II II Apontador Apontador this this II II

Sobrecarga de Operadores XVII

Sobrecarga de Operadores XVII

pDadopDado

nTamnTam

this Referência ao membro de Dados

Equivalente a

pDadopDado this->pDado

nTamnTam this->nTamObjeto CStr

(*this)

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

23{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream I I

Objeto Objeto coutcout Representante do Representante do streamstream de saída em C++ de saída em C++

Relacionado ao Relacionado ao fluxo de dados a serem fluxo de dados a serem impressos na telaimpressos na tela

Operador de Inserção Operador de Inserção << << Operador Operador <<<< sobrecarregado para a sobrecarregado para a

execução da saída (impressão em tela) a execução da saída (impressão em tela) a partir de partir de streamsstreams

Objeto Objeto coutcout usado em conjunto com usado em conjunto com <<<< para para a impressão de dadosa impressão de dados

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream I I

Objeto Objeto coutcout Representante do Representante do streamstream de saída em C++ de saída em C++

Relacionado ao Relacionado ao fluxo de dados a serem fluxo de dados a serem impressos na telaimpressos na tela

Operador de Inserção Operador de Inserção << << Operador Operador <<<< sobrecarregado para a sobrecarregado para a

execução da saída (impressão em tela) a execução da saída (impressão em tela) a partir de partir de streamsstreams

Objeto Objeto coutcout usado em conjunto com usado em conjunto com <<<< para para a impressão de dadosa impressão de dados

Sobrecarga de Operadores XVIII

Sobrecarga de Operadores XVIII

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

24{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream II II

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream II II

Sobrecarga de Operadores XIX

Sobrecarga de Operadores XIX

#include#include <iostream> <iostream>usingusing namespace std; namespace std;intint main() main(){{

cout << “Teste com um cout\n";cout << “Teste com um cout\n";// impressao de uma linha a partir de multiplos comandos// impressao de uma linha a partir de multiplos comandoscout << "Teste com ";cout << "Teste com ";cout << "dois couts\n";cout << "dois couts\n";// uso do manipulador endl, geracao de caractere de nova // uso do manipulador endl, geracao de caractere de nova // linha e esvaziamento do buffer de saída// linha e esvaziamento do buffer de saídacout << “Teste com endl..." << endl;cout << “Teste com endl..." << endl;cout << “... e flush \n";cout << “... e flush \n";cout << flush; cout << flush; // esvaziamento do buffer de saída, sem// esvaziamento do buffer de saída, sem//geracao de nova linha//geracao de nova linhareturnreturn 0; 0;

}}

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

25{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream III III

Retorno de uma referência ao objeto Retorno de uma referência ao objeto coutcout por por <<<< Possibilidade de encadeamento Possibilidade de encadeamento de vários de vários coutcout e de combinação de e de combinação de constantes e variáveisconstantes e variáveis

intint x = 1, y = 2;x = 1, y = 2;// impressao de uma string e o resultado da // impressao de uma string e o resultado da soma entre as variaveis x e ysoma entre as variaveis x e ycout << "Encadeamento de saidas – Soma de cout << "Encadeamento de saidas – Soma de dois números " << x + y << endl;dois números " << x + y << endl;

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream III III

Retorno de uma referência ao objeto Retorno de uma referência ao objeto coutcout por por <<<< Possibilidade de encadeamento Possibilidade de encadeamento de vários de vários coutcout e de combinação de e de combinação de constantes e variáveisconstantes e variáveis

intint x = 1, y = 2;x = 1, y = 2;// impressao de uma string e o resultado da // impressao de uma string e o resultado da soma entre as variaveis x e ysoma entre as variaveis x e ycout << "Encadeamento de saidas – Soma de cout << "Encadeamento de saidas – Soma de dois números " << x + y << endl;dois números " << x + y << endl;

Sobrecarga de Operadores XX

Sobrecarga de Operadores XX

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

26{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream IV IV

Alternativa para a apresentação de Alternativa para a apresentação de caracteres em tela caracteres em tela semsem o uso do operador o uso do operador de inserção de inserção << << Uso da função-membro Uso da função-membro putput

cout.put('caractere');cout.put('caractere');//saida de um único //saida de um único // caractere// caracterecout.put('caractere').put('\n');cout.put('caractere').put('\n');//saída encadeada//saída encadeada

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream IV IV

Alternativa para a apresentação de Alternativa para a apresentação de caracteres em tela caracteres em tela semsem o uso do operador o uso do operador de inserção de inserção << << Uso da função-membro Uso da função-membro putput

cout.put('caractere');cout.put('caractere');//saida de um único //saida de um único // caractere// caracterecout.put('caractere').put('\n');cout.put('caractere').put('\n');//saída encadeada//saída encadeada

Sobrecarga de Operadores XXI

Sobrecarga de Operadores XXI

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

27{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream V V Objeto Objeto cincin

Representante do Representante do streamstream de entrada em de entrada em C++C++ Relacionado ao Relacionado ao fluxo de dados a serem fluxo de dados a serem

capturados sem espaços e sem tabulações, capturados sem espaços e sem tabulações, vindos do tecladovindos do teclado

Operador de Extração Operador de Extração >> >> Operador Operador >>>> sobrecarregado para a sobrecarregado para a

execução da entrada de execução da entrada de streamsstreams

Objeto Objeto cincin usado em conjunto com usado em conjunto com >>>> para para a aquisição de dados do tecladoa aquisição de dados do teclado

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream V V Objeto Objeto cincin

Representante do Representante do streamstream de entrada em de entrada em C++C++ Relacionado ao Relacionado ao fluxo de dados a serem fluxo de dados a serem

capturados sem espaços e sem tabulações, capturados sem espaços e sem tabulações, vindos do tecladovindos do teclado

Operador de Extração Operador de Extração >> >> Operador Operador >>>> sobrecarregado para a sobrecarregado para a

execução da entrada de execução da entrada de streamsstreams

Objeto Objeto cincin usado em conjunto com usado em conjunto com >>>> para para a aquisição de dados do tecladoa aquisição de dados do teclado

Sobrecarga de Operadores XXII

Sobrecarga de Operadores XXII

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

28{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream VI VI

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream VI VI

Sobrecarga de Operadores XXIII

Sobrecarga de Operadores XXIII

#include#include <iostream> <iostream>usingusing namespace std; namespace std;intint main() main(){{

int n1,n2;int n1,n2;cout << “Captura do primeiro valor: ";cout << “Captura do primeiro valor: ";cin >> n1;cin >> n1;cout << endl;cout << endl;cout << “Captura do segundo valor: ";cout << “Captura do segundo valor: ";cin >> n2;cin >> n2;cout << endl;cout << endl;returnreturn 0; 0;

}}

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

29{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream VII VII

SínteseSíntese cout<<cout<< e e cin>>cin>> Sobrecargas de Sobrecargas de

operadores disponíveis na biblioteca operadores disponíveis na biblioteca padrão padrão iostreamiostream da linguagem C++ da linguagem C++

coutcout e e cincin Objetos das classes Objetos das classes ostreamostream e e istreamistream, respectivamente, respectivamente

Possibilidade de inclusão de funções Possibilidade de inclusão de funções amigas para a sobrecarga dos operadoresamigas para a sobrecarga dos operadores <<<< e e >>>>

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream VII VII

SínteseSíntese cout<<cout<< e e cin>>cin>> Sobrecargas de Sobrecargas de

operadores disponíveis na biblioteca operadores disponíveis na biblioteca padrão padrão iostreamiostream da linguagem C++ da linguagem C++

coutcout e e cincin Objetos das classes Objetos das classes ostreamostream e e istreamistream, respectivamente, respectivamente

Possibilidade de inclusão de funções Possibilidade de inclusão de funções amigas para a sobrecarga dos operadoresamigas para a sobrecarga dos operadores <<<< e e >>>>

Sobrecarga de Operadores XXIV

Sobrecarga de Operadores XXIV

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

30{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream VIII VIII

Exemplo 06Exemplo 06

Sobrecarga dos Operadores de Inserção e Sobrecarga dos Operadores de Inserção e Extração de Extração de StreamStream VIII VIII

Exemplo 06Exemplo 06

Sobrecarga de Operadores XXV

Sobrecarga de Operadores XXV

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;cout<< d1; // operador sobrecarregado

coutcout objeto de ostreamostream

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

31{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

Sobrecarga dos Operadores de Inserção e Extração Sobrecarga dos Operadores de Inserção e Extração de de StreamStream IX IX

Exemplo 08 – Inclusão de uma função amiga para Exemplo 08 – Inclusão de uma função amiga para sobrecarga de sobrecarga de >>>>

Sobrecarga dos Operadores de Inserção e Extração Sobrecarga dos Operadores de Inserção e Extração de de StreamStream IX IX

Exemplo 08 – Inclusão de uma função amiga para Exemplo 08 – Inclusão de uma função amiga para sobrecarga de sobrecarga de >>>>

Sobrecarga de Operadores XXVI

Sobrecarga de Operadores XXVI

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); }

cincin objeto de istreamistream

cin >> d1;cin >> d1;

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

32{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

SínteseSíntese

Possibilidade de formulação de notações Possibilidade de formulação de notações convenientes para comportamentos de objetosconvenientes para comportamentos de objetos

Possibilidades de implementaçãoPossibilidades de implementação Via Via funções-membrosfunções-membros Via Via funções não membros típicasfunções não membros típicas Via Via funções amigasfunções amigas

SínteseSíntese

Possibilidade de formulação de notações Possibilidade de formulação de notações convenientes para comportamentos de objetosconvenientes para comportamentos de objetos

Possibilidades de implementaçãoPossibilidades de implementação Via Via funções-membrosfunções-membros Via Via funções não membros típicasfunções não membros típicas Via Via funções amigasfunções amigas

Sobrecarga de Operadores XXVII

Sobrecarga de Operadores XXVII

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

{jose

ana,

ran

gel}@

dsc.

ufcg

.edu

.br

DSC/CCT/UFCG

DSC/CCT/UFCG

[email protected]@dsc.ufcg.edu.br [email protected]@dsc.ufcg.edu.br

José Eustáquio Rangel de Queiroz

José Eustáquio Rangel de Queiroz

DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

UNIVERSIDADE FEDERAL DE CAMPINA GRANDE

UNIVERSIDADE FEDERAL DE CAMPINA GRANDECENTRO DE ENGENHARIA ELÉTRICA E

INFORMÁTICACENTRO DE ENGENHARIA ELÉTRICA E

INFORMÁTICA