C++ - Sobrecarga de Operadores

Documentos relacionados
Sobrecarga de Operadores

C++ - Ponteiros (continuação) cout << \nquantas notas? ; cin >> tamanho; notas = new int[tamanho]; //aloca memória

C++ - Classes e Objetos

Estrutura de dados 1. Ponteiros

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

4.1- Aritméticos + soma - subtração * multiplicação / divisão % módulo (resto da divisão de inteiros ).

Capítulo 7. Expressões e Sentenças de Atribuição

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Técnicas de Programação:

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

INFORMÁTICA APLICADA AULA 03 LINGUAGEM DE PROGRAMAÇÃO C++

Técnicas de Programação em Engenharia Elétrica I - Engenharia de Sistemas Embarcados - Prof. Alessandro Zimmer Introdução à Linguagem C

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Programação Orientada a Objetos

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Análise de Programação

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Programação científica C++

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Algoritmos II prof. Daniel Oliveira

12. SOBRECARGA DE OPERADOR

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

Programação Estruturada e Orientada a Objetos

Linguagem Java - Introdução

Variáveis primitivas e Controle de fluxo

Conceitos básicos de programação

Orientação a Objetos e Java

Paradigmas de Linguagens de Programação. Expressões e Instruções de Atribuição

Programação Orientada a Objetos para Redes de Computadores

Programação Orientada a Objetos para Redes de Computadores. Fundamentos de Sobrecarga de Operadores. Sobrecarga de Operadores

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Redefinição de Operadores

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

C++ - Herança. Herança é o processo pelo qual criamos novas classes, chamadas classes derivadas, baseadas em classes existentes ou classes-base.

C++ - Funções. Forma geral das funções C++

3. Linguagem de Programação C

Programação Orientada a Objetos Aula I Declaração de classes, métodos construtores. Prof.: Bruno E. G. Gomes IFRN

Algoritmos e Programação

Overloading de Operadores

C++ - Matrizes. Observ.: C++ não avisa quando o limite de uma matriz foi excedido. Providenciar a verificação é responsabilidade do programador.

MsC. João Maria MsC. Liviane Melo

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

EXPRESSÕES BOOLEANAS. Ex: boolean b = false; // declara uma variável do tipo boolean e atribui false

Linguagens de Programação I

Sintaxe da linguagem Java

Linguagens de Programação

Linguagens de Programação. Parte IV. Relembrando da Última Aula... Sobrecarga de Operadores. Fundamentos de Sobrecarga de Operadores

Java Variáveis e Controle Fluxo

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

CIV 2802 Sistemas Gráficos para Engenharia º Trabalho: Programação básica em C++: Classes

CIT Aula 02 Variáveis e Estruturas de desvio condicional. Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1

Introdução à linguagem C++

Elementos Básicos. C# - Elementos básicos. Primeiro programa Tipos de dados Variáveis Constantes Expressões e operadores Controlo de fluxo Tabelas

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa

Expressões e sentença de atribuição

Capítulo 2 Operadores. A função scanf()

ESTRUTURA COM DECISÃO COMPOSTA

Programação Estruturada

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença

Introdução a JAVA. Variáveis, tipos, expressões, comandos e blocos

Aula de hoje. Expressões. Expressões. Expressões. Exemplos. Programa em Python. SCC Introdução à Programação para Engenharias

Programação com Acesso a BD. Programação com OO Acesso em Java

Java 2 Standard Edition Tipos, literais, operadores e controle de fluxo

Linguagem de Programação C++

Tipos, Literais, Operadores

Tipos, Literais, Operadores

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO MÚLTIPLA. Prof. Dr. Daniel Caetano

Introdução à Ciência da Computação scc-120

Operadores. A linguagem C é muito rica em operadores internos. Ela define quatro classes de operadores:

Estrutura de Condição, Escolha e Repetição

/* Este programa realiza um somatório e exibe o resultado na tela do computador */

Sintaxe Básica do Java. João Paulo Q. dos Santos

Overloading de Operadores

Introdução à Linguagem C++

TÉCNICO DE INFORMÁTICA - SISTEMAS

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

Introdução a JAVA. Variaveis, tipos, expressões, comandos e blocos

Aula 9 Oficina de Programação Strings. Profa. Elaine Faria UFU

Programação Aplicada à Engenharia

PCI- Operadores, Expressões e Funções. Profa. Mercedes Gonzales Márquez

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

3. Linguagem de Programação C

//conteúdo do arquivo Matriz.h class Matriz { private: int *elementos; int numerodelinhas; int numerodecolunas; void setnumerodelinhas(int); void

Ambientação com a Sintaxe de Java: parte 1

K&R: Capitulo 2 IAED, 2012/2013

Aula 26: Estruturas heterogêneas

Por que programar? Programação de Computadores Introdução a C++ É tudo questão de automatizar coisas. Alan de Freitas

Algoritmos I Aula 13 Linguagem de Programação Java

Preparatório OBI. Prof. André Gustavo Duarte de Almeida docente.ifrn.edu.br/andrealmeida. Aula 01 Introdução a C++

Operadores e Estruturas de Decisão. Vanessa Braganholo

RESUMO DE CONCEITOS BÁSICOS DE C

Linguagem C Operadora

Linguagens de Programação

Programação Orientada a Objetos II

Programação Orientada a Objetos

Transcrição:

C++ - Sobrecarga de Operadores Sobrecarregar um operador significa redefinir seu símbolo, de maneira que ele se aplique também a tipos de dados definidos pelo usuário como classes e estruturas. A implementação de sobrecarga de operadores é definida por meio de funções chamadas operadoras, criadas como membro da classe ou como funções globais. Limitações : Respeitar a definição original do operador Não é possível mudar o operador de unário para binário. Não se pode inventar símbolos novos. Não é possível modificar a precedência de operadores por meio de sobrecarga. Operadores que não podem ser sobrecarregados:. (operador ponto) :: (operador de resolução de escopo)? : (operador ternário) Sobrecarga de Operadores Unários : Operador de incremento pré-fixado class ponto { private : int x, y; ponto (int x1=0, int y1=0) {x=x1; y=y1; // construtor ponto operator ++( ) // função operadora pré-fixada { ++x; ++y; return ponto(x, y); void printpt( ) const // imprime ponto { cout << ( << x <<, << y << ) ; ; { ponto p1, p2(2,3), p3; // declara e inicializa cout << \n p1 = ; p1.printpt( ); // imprime cout << \n++p1 = ; (++p1).printpt( ); // incrementa e imprime p3 = ++p2; // incrementa e atribui cout << \n p3 = ; p3.printpt( ); // imprime

Observ.: ++p1 ; é equivalente a p1.operator++( ); Sobrecarga do operador de incremento pós-fixado : Para distinguir entre as formas pré e pós-fixada, o compilador utiliza o número de argumentos da função operadora. sem parâmetro : pré-fixado operator ++ ( ) com um parâmetro do tipo int : pós-fixadooperator ++ (int) ponto operator ++(int) { ++x; ++y; return ponto(x-1, y-1); // função operadora pós-fixada Sobrecarga de operadores binários : função operadora com um argumento. Ex.: sobrecarga do + aritmético class venda { venda operator + (venda v) const; // função operadora venda venda :: operator + (venda v) const // soma dois objetos { int pec = npecas + v.pecas; float pre = preco + v.preco; return venda(pec, pre); { venda A(58, 12734.53), B(30, 6000.30), T; T = A + B; Somando objetos da classe ponto : funções operadoras class ponto { ponto operator + (ponto p) const // soma dois objetos { return ponto(x+p.x, y+p.y); ponto operator + (int n) const // soma um número a um objeto { { return ponto(x+n, y+n);

p3 = p1 + p2; p4 = p1 + 5; Observ.: p4 = p1 + 5 ; é equivalente a p4 = p1.operator + (5); por isso não podemos escrever instruções p4 = 5 + p1; que seriam interpretadas como: p4 = 5. operator + (p1) // errado Operadores para manipular strings : +=, +, <, ==, > enum Boolean { False, True; class string { string operator +=(string s) const { string temp; if (strlen(str) + strlen(s.str) < MAX) { strcpy( temp.str, str); strcat(temp.str, s.str); else cout << \nmemória Esgotada!! ; return temp; string operator +(string s) const // concatena { string temp; temp +=s.str; return temp; Boolean operator < (string s) const { return (strcmp(str, s.str) < 0)? True : False; Boolean operator ==(string s) const { return (strcmp(str, s.str) == 0)? True : False; string getstr( ) { gets(str); return string(str); void main ( ) { string s[max]; for (int n=0; n<= 80; n++) { cout << \ndigite nome ou <enter> para encerrar ; if (s[n].getstr( ) == ) break;

cout << \nlista Original ; for (int i=0; i<n ; i++) { cout << \ns[ << i << ] = ; s[i].print( ); ordena (s, n); cout << \nlista Ordenada ; for (int i=0; i<n ; i++) { cout << \ns[ << i << ] = ; s[i].print( ); void ordena (string s[ ], int n) { string temp; int j; for (int i=0; i<n ; i++) for ( j=i+1; j<n ; j++) if (s[i] > s[j]) { temp =s[i]; s[i] = s[j]; s[j] = temp Sobrecarga do operador [ ] : checagem de limites de matrizes #include <iostream.h> #include <iomanip.h> const MAX = 50; class matriz { private : float n[max]; matriz( ); // construtor float& operator [ ] (int indice); // sobrecarga de [ ] float media( int i); ; matriz :: matriz( ) { for( int i=0; i < MAX; i++) n[i] = 0.0; float& matriz :: operator [ ] (int indice)

{ static float x = -1; if ( indice >= 0 && indice < MAX) return n[indice]; else { cout << "\nfora de limite"; return x; float matriz :: media (int i) { float m= 0.0; for (int j=0; j<i; j++) m += n[j]; return m/float(i); { matriz notas; cout << setprecision(2); int i=0; do { cout << ""\ndigite a nota do aluno " << (i+1) << " : "; cin >> notas [i]; while (notas[i++] >= 0); cout << "\nmedia das notas : " << notas.media(i); Observ. : A função operator[ ] retorna uma referência a um elemento da matriz n. Dessa forma, a expressão notas[i] age como o próprio elemento da matriz privada, podendo ser usada em instruções como cin >> notas[i]; ou notas[i] = 6.7; A função operator[ ] cria uma variável static, pois não é possível retornar referência a uma variável automática. Conversões entre tipos básicos : implícita explícita (operdor molde) Conversão de tipos com classes : double dvar = 'A'; double dvar = double ('A'); objetos a tipos básicos - sobrecarga do operador molde criando função conversora. Ex.: Conversão de um objeto string a tipo int ou float #include <stdlib.h>

class string { operator int( ) const // função conversora { return atoi(str); operator double( ) const // função conversora { return atof(str); ; void main ( ) { string s1("1234"), s2("1234.56"); int i = s1; // conversão de string para int double d = s2; // conversão de string para double tipos básicos a objetos : sobrecarga do operador de atribuição = Ex.: conversão de um int a um objeto string. Class string { void operator = (int n) { itoa(n, str, 10); ; void main ( ) { string s; s = 5392; // sobrecarga do operador de atribuição // conversão de inteiro para string objeto a objeto (classes diferentes ) - obja = objb Dois métodos : função-membro conversora da classe B construtor membro da classe A Primeiro método : função conversora Classes graus e radianos. Converter objetos da classe radianos em objetos da classe graus (grau = radiano). Função conversora na classe radianos.

#include <iostream.h> #include <iomanip.h> #define PI 3.141592653 class graus { private : double g; graus (double x) { g=x; graus ( ) { g = 0; void print( ) { cout << setiosflags (ios :: fixed) << setiosflags (ios :: showpoint) << setprecision (2) << g << \xf8\n ; ; class radianos { private: double rad; radianos (double r) { rad = r ; radianos ( ) {rad = 0.0 ; ; { graus gr; radianos rd(pi); gr = rd; operator graus ( ) { return graus(180.0*rad/pi); void print( ) { cout << setioflags (ios :: fixed) << setiosflags (ios :: showpoint) << setprecision (2) << rad << rad \n ; // função conversora de rad. para graus // converte radianos para graus Segundo método : função construtora (implementada na classe graus)

class radianos { double getrad ( ) {return rad; ; class graus { graus (radianos rd) // construtor para conversão { g = (180.0 * rd.getrad( ) / PI; ; { graus gr; radianos rd(pi); gr = rd; // converte radianos para graus conversões dos dois lados : (graus em radianos e radianos em graus) As duas funções presentes na mesma classe. class radianos { ; class graus { graus (radianos rd) // construtor para conversão { g = (180.0 * rd.getrad( ) / PI; ; operator radianos ( ) // função conversora de tipo { return radianos(g * PI / 180.0);

void main ( ) { graus gr, gr1(180.0); radianos rd(pi), rd1; gr = rd; // converte radianos para graus rd1 = gr1; // converte graus para radianos Conversões : quando usar o quê? Quando as duas classes são acessíveis, podemos escolher entre o uso de função conversora ou construtora. Porém se uma das classes pertencer a uma biblioteca, da qual não temos acesso ao fonte, dois casos podem acontecer. Se usarmos instruções como: meu_obj = lib_obj; devemos implementar função construtora de um argumento. Já nas instruções: lib_obj = meu_obj; temos que implementar função conversora de tipo. Exercícios Assunto : Sobrecarga de Operadores. Crie uma classe que defina um número complexo x + yi, onde x e y são do tipo float e i é a raiz quadrada de -1. Defina as operações aritméticas entre números complexos nesta classe. Prática VIII Defina uma classe chamada fração. Esta classe deve armazenar o numerador e o denominador de uma fração em duas variáveis inteiras. Inclua : a) dois construtores: o primeiro sem argumentos e o outro que recebe numerador e denominador da fração; b) uma função-membro que retorna o numerador e outra que retorna o denominador; c) as operações de adição, subtração, multiplicação e divisão; d) as operações de incremento e decremento pré-fixadas; e) um conversor de tipo que converte um objeto fração para um tipo float;