{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
Download

Sobrecarga dos Operadores de Inserção e