Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Diversas Apostilas de C++ - cpp, Notas de estudo de Informática

- - - - - - -

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 11/08/2008

marcelo-pacifico-5
marcelo-pacifico-5 🇧🇷

5

(1)

9 documentos

1 / 389

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
C ++ Como Uma Linguagem de Programação Orientada a Objetos
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Pré-visualização parcial do texto

Baixe Diversas Apostilas de C++ - cpp e outras Notas de estudo em PDF para Informática, somente na Docsity!

C ++ Como Uma Linguagem de Programação Orientada a Objeto

Table of Contents

  • TUTORIAL:........................................................................................................................................................
    • "C++ COMO UMA LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS."................. - Transfer interrupted!..........................................................................................................................
      • 1.1. ESPECIFICANDO UMA CLASSE................................................................................................
      • 1.2. STRUCT EM C++........................................................................................................................... - 1.2.1. ATRIBUTOS OU DADOS MEMBRO................................................................................. - 1.2.2. MÉTODOS OU FUNÇÕES MEMBRO................................................................................ - 1.2.3. FUNÇÕES MEMBRO QUE RETORNAM VALORES....................................................... - CHAMAMANDO FUNÇÕES MEMBRO............................................................................. 1.2.4. FUNÇÕES DECLARADAS EXTERNAS A CLASSE , FUNÇÕES MEMBRO - 1.2.5. ALGO PARECIDO EM UMA LINGUAGEM PROCEDURAL........................................ - 1.2.6. CONSTRUTORES............................................................................................................... - 1.2.7. CONSTRUTORES E AGREGAÇÃO................................................................................. - 1.2.8. DESTRUTORES..................................................................................................................
      • 1.3. ENCAPSULAMENTO COM "CLASS"...................................................................................... - 1.3.1. ATRIBUTOS PRIVATE, FUNÇÕES MEMBRO PUBLIC............................................... - 1.3.2. UM DADO MEMBRO É PUBLIC...................................................................................... - 1.3.3. COMPILANDO UM PROGRAMA COM VÁRIOS ARQUIVOS.....................................
      • 1.4. TIPO ABSTRATO DE DADOS................................................................................................... - 1.4.1. TAD FRAÇÃO.....................................................................................................................
      • 1.5. CONSIDERAÇÕES C++:............................................................................................................. - 1.5.1. CONST................................................................................................................................. - 1.5.2. FUNÇÕES INLINE............................................................................................................. - 1.5.3. ALOCAÇÃO DINÂMICA COM NEW E DELETE........................................................... - 1.5.4. REFERÊNCIA &.................................................................................................................
      • 1.6. RECAPITULANDO.................................................................................................................... - 1.6.1. ARGUMENTOS DE LINHA DE COMANDO................................................................
    1. CLASSES E OBJETOS............................................................................................................................. Table of Contents
    1. HERANÇA.................................................................................................................................................
    • 2.1. HIERARQUIAS DE TIPOS........................................................................................................
      • 2.1.1. UMA HIERARQUIA SIMPLES.......................................................................................
      • 2.1.2. PROTECTED.....................................................................................................................
      • 2.1.3. REDEFINIÇÃO DE FUNÇÕES MEMBRO HERDADAS..............................................
      • 2.1.4. UMA HIERARQUIA DE LISTAS LIGADAS.................................................................
    • 2.2. HIERARQUIAS DE IMPLEMENTAÇÃO................................................................................
      • 2.2.1. FILA A PARTIR DE UMA LISTA...................................................................................
    1. POLIMORFISMO, FUNÇÕES VIRTUAIS...........................................................................................
    • 3.1. O QUE SIGNIFICA POLIMORFISMO.....................................................................................
      • 3.1.1. SOBRECARGA DE MÉTODOS......................................................................................
        • HERDEIRA........................................................................................................................... 3.1.2. REDEFINIÇÃO DE UMA FUNÇÃO MEMBRO PARA UMA CLASSE
      • 3.1.3. "COPY CONSTRUCTOR"................................................................................................
      • 3.1.4. SOBRECARGA DE FUNÇÃO EM C++..........................................................................
      • 3.1.5. "DEFAULT ARGUMENTS", VALORES SUGESTÃO..................................................
      • 3.1.6. SOBRECARGA DE OPERADOR....................................................................................
    • 3.2. CLASSES ABSTRATAS E CONCRETAS................................................................................
      • 3.2.1. CLASSE ABSTRATA ITERADOR..................................................................................
      • 3.2.2. ACOPLAMENTO DE MENSAGENS..............................................................................
      • 3.2.3. CONTAS BANCÁRIAS....................................................................................................
      • 3.2.4. LISTA HETEROGÊNEA DE CONTAS BANCÁRIAS...................................................
    1. TÓPICOS AVANÇADOS......................................................................................................................... Table of Contents
    • 4.1. FRIENDS.....................................................................................................................................
      • 4.1.1. UMA CLASSE PERMITINDO ACESSO A OUTRA......................................................
      • 4.1.2. OPERADORES E FRIENDS.............................................................................................
    • 4.2. HERANÇA MÚLTIPLA.............................................................................................................
      • 4.2.1. UM EXEMPLO SIMPLES................................................................................................
      • 4.2.2. VIRTUAL PUBLIC E RESOLUÇÃO DE CONFLITOS.................................................
    • 4.3. POLIMORFISMO PARAMÉTRICO (TEMPLATE).................................................................
      • 4.3.1. TAD VETOR.....................................................................................................................
      • 4.3.2. TEMPLATE DE FUNÇÃO...............................................................................................
      • 4.3.3. HERANÇA E TEMPLATES.............................................................................................
      • 4.3.4. TEMPLATES E AGREGAÇÃO.......................................................................................
    • 4.4. METACLASSES.........................................................................................................................
      • 4.4.1. UM TIPO SIMPLES COMO STATIC..............................................................................
      • 4.4.2. UM TIPO DEFINIDO PELO USUÁRIO USADO COMO STATIC...............................
    • 4.5. TRATAMENTO DE EXCEÇÕES..............................................................................................
    • 4.6. CONCLUSÕES...........................................................................................................................
      • 4.6.1. ÁRVORE BINÁRIA..........................................................................................................
      • 4.6.2. SIMULAÇÃO DIRIGIDA A EVENTOS..........................................................................

TUTORIAL:

"C++ COMO UMA LINGUAGEM DE PROGRAMAÇÃO

ORIENTADA A OBJETOS."

Copyright ©

André Augusto Cesta. aacesta@dcc.unicamp.br

Orientadora: Profa Dra Cecília Mary Fischer Rubira

PROGRAMAÇÃO ORIENTADA A OBJETOS

Este tutorial se propõe a ensinar programação orientada a objetos em C++. A maioria dos livros não apresenta a linguagem nesse contexto, dando uma atenção maior para os recursos de C++ do que para a metodologia de programação. É recomendável que o leitor tenha acesso a um desses livros visto que não ensinaremos aqui aspectos considerados básicos que são em geral quase todos que permitem usar C++ como um C melhorado. Você pode usar C++, como uma linguagem procedural com recursos avançados, mais uma vez não é isso que pretendemos ensinar neste texto.

Na prática de programação orientada a objetos estaremos atentos em nossos programas para pontos como:

−Compatibilidade, portabilidade.

−Segurança.

−Reusabilidade.

TUTORIAL: 1

1. CLASSES E OBJETOS

Uma classe é um tipo definido pelo usuário que contém o molde, a especificação para os objetos, assim como o tipo inteiro contém o molde para as variáveis declaradas como inteiros. A classe envolve, associa, funções e dados, controlando o acesso a estes, definí−la implica em especificar os seus atributos (dados) e suas funções membro (código).

Um programa que utiliza uma interface controladora de um motor elétrico provavelmente definiria a classe motor. Os atributos desta classe seriam: temperatura, velocidade, tensão aplicada. Estes provavelmente seriam representados na classe por tipos como float ou long. As funções membro desta classe seriam funções para alterar a velocidade, ler a temperatura, etc.

Um programa editor de textos definiria a classe parágrafo que teria como um de seus atributos uma string ou um vetor de strings, e como funções membro, funções que operam sobre estas strings. Quando um novo parágrafo é digitado no texto, o editor cria a partir da classe parágrafo um objeto contendo as informações particulares do novo texto. Isto se chama instanciação ou criação do objeto.

Classes podem ser declaradas usando a palavra reservada struct ou a palavra reservada class, nos exemplos posteriores entraremos em mais detalhes. As classes do próximo tópico 1.2 são declaradas com

Transfer interrupted!

áticas. Quando chegarmos em encapsulamento 1.3 mostraremos como declarar classes com class e não usaremos mais struct no tutorial.

1.1. ESPECIFICANDO UMA CLASSE

Suponha um programa que controla um motor elétrico através de uma saída serial. A velocidade do motor é

  1. CLASSES E OBJETOS 3

proporcional a tensão aplicada, e esta proporcional aos bits que vão para saída serial e passando por um conversor digital analógico.

Vamos abstrair todos estes detalhes por enquanto e modelar somente a interface do motor como uma classe, a pergunta é que funções e que dados membro deve ter nossa classe, e que argumentos e valores de retorno devem ter essas funções membro:

Representação da velocidade:

A velocidade do motor será representada por um atributo, ou dado membro, inteiro (int). Usaremos a faixa de bits que precisarmos, caso o valor de bits necessário não possa ser fornecido pelo tipo , usaremos então o tipo long , isto depende do conversor digital analógico utilizado e do compilador.

Representação da saída serial:

O motor precisa conhecer a sua saída serial, a sua ligação com o "motor do mundo real". Suponha uma representação em hexadecimal do atributo endereço de porta serial, um possível nome para o atributo: enderecomotor. Não se preocupe em saber como usar a representação hexadecimal.

Alteração do valor da velocidade:

Internamente o usuário da classe motor pode desejar alterar a velocidade, cria−se então o método ( em C++ função membro): void altera_velocidade(int novav);. O código anterior corresponde ao cabeçalho da função membro, ela é definida junto com a classe motor, associada a ela. O valor de retorno da função é void (valor vazio), poderia ser criado um valor de retorno (int) que indicasse se o valor de velocidade era permitido e foi alterado ou não era permitido e portanto não foi alterado.

Não faz sentido usar, chamar, esta função membro separada de uma variável do tipo motor, mas então porque na lista de argumentos não se encontra um motor? Este pensamento reflete a maneira de associar dados e código (funções) das linguagens procedurais. Em linguagens orientadas a objetos o código e os dados são ligados de forma diferente, a própria declaração de um tipo definido pelo usuário já engloba as declarações

  1. CLASSES E OBJETOS 4
1.2.1. ATRIBUTOS OU DADOS MEMBRO.................................................................................

Este exemplo declara uma struct e em seguida cria um objeto deste tipo em main alterando o conteúdo desta variável. Uma struct é parecida com um record de Pascal, a nossa representa um círculo com os atributos raio, posição x , posição y, que são coordenadas cartesianas. Note que este objeto não possui funções membro ainda.

#include <iostream.h>

struct circulo

//struct que representa um circulo.

{

float raio;

float x;

//posicoes em coordenadas cartesianas

float y;

};

void main()

{

circulo ac;

1.2.1. ATRIBUTOS OU DADOS MEMBRO. 6

//criacao de variavel , veja comentarios.

ac.raio=10.0;

//modificacao de conteudo (atributos) da struct

ac.x=1.0;

//colocando o circulo em uma posicao determinada

ac.y=1.0;

//colocando o circulo em uma posicao determinada

cout << "Raio:"<<ac.raio <<endl;

//verificacao dos atributos alterados.

cout << "X:"<<ac.x << "\n"; // "\n"==endl

cout << "Y:" <<ac.y<< endl;

}

Resultado do programa:

Raio:

X:

Y:

1.2.1. ATRIBUTOS OU DADOS MEMBRO. 7

Os programadores C podem notar algo interessante: "C++ não requer a palavra struct na declaração da variável, ela se comporta como um tipo qualquer: int , float ...". Outros programadores que não haviam usado struct previamente em C não se preocupem, façam apenas os exercícios deste exemplo e estarão aptos a prosseguir.

Exercícios:

  1. Repita o mesmo exemplo só que agora mova o círculo alterando as componentes x e y. Ponha o círculo em (0.0,0.0) através de atribuições do tipo ac.x=1.0; mova o círculo para (1.0,1.0). Acompanhe todas as modificações da struct através de cout's.

2)Simplifique o programa anterior retirando o atributo raio. Você pode dar o nome de ponto ou ponto_geometico para esta classe.

1.2.2. MÉTODOS OU FUNÇÕES MEMBRO................................................................................

C++ permite que se acrescente funções de manipulação da struct em sua declaração, juntando tudo numa só entidade que é uma classe. Essas funções membro podem ter sua declaração (cabeçalho) e implementação (código) dentro da struct ou só o cabeçalho (assinatura) na struct e a implementação, código, fora. Este exemplo apresenta a primeira versão, o próximo a segunda versão (implementação fora da classe).

Essas funções compõem a interface da classe. A terminologia usada para designá−las é bastante variada: funções membro, métodos, etc. Quando uma função membro é chamada, se diz que o objeto está recebendo uma mensagem (para executar uma ação).

Um programa simples para testes sobre funções membro seria o seguinte:

#include <iostream.h>

1.2.2. MÉTODOS OU FUNÇÕES MEMBRO. 9

struct contador

//conta ocorrencias de algo

{

int num;

//numero do contador

void incrementa(void){num=num+1;};

//incrementa contador

void comeca(void){num=0;};

//comeca a contar

};

void main()

//teste do contador

{

contador umcontador;

umcontador.comeca();

//nao esqueca dos parenteses, e uma funcao membro e nao atributo!

1.2.2. MÉTODOS OU FUNÇÕES MEMBRO. 10

estar presentes: umcontador.incrementa();. Primeiro insere−se o nome do objeto e depois a chamada da função, estes são separados por um ponto. Cuidado para não esquecer os parênteses nas chamadas de funções membro em programas futuros, este é um erro bastante comum.

Agora o programa mais complicado, porém baseado no exemplo 1.2.1:

#include <iostream.h> //para cout

struct circulo

{

float raio;

float x;

//atributo coordenada cartesiana x

float y;

//atributo coordenada cartesiana y

void move(float dx,float dy)

//função membro ou função membro move

{

x+=dx;

//equivale a x=x+dx;

1.2.2. MÉTODOS OU FUNÇÕES MEMBRO. 12

y+=dy;

}

void mostra(void) //função membro ou função membro mostra

{

cout << "Raio:"<<raio <<endl;

cout << "X:"<<x << endl;

cout << "Y:" <<y<< endl;

}

};

void main()

{

circulo ac;

// * instanciação de um objeto circulo (criacao)

ac.x=0.0;

ac.y=0.0;

ac.raio=10.0;

1.2.2. MÉTODOS OU FUNÇÕES MEMBRO. 13

Comentários:

A função membro move altera as coordenadas do objeto. O objeto tem suas coordenadas x e y somadas com os argumentos dessa função membro. Note que esta função membro representa uma maneira mais segura, clara, elegante de alterar as coordenadas do objeto do que acessá−las diretamente da seguinte forma: ac.x+=dx;. ac.y+=dy;. Lembre−se que ac.x+=dx é uma abreviação para ac.x=ac.x+dx;.

Como funcionam no compilador as chamadas de funções membro:

É possível imaginar que as definições de funções membro ocupam um grande espaço na representação interna dos objetos, mas lembre−se que elas são todas iguais para uma classe então basta manter para cada classe uma tabela de funções membro que é consultada no momento da chamada. Os objetos só precisam ter uma referência para esta tabela.

Exercícios:

1)Neste mesmo programa, crie uma função para a struct chamada "inicializa" que deve ter como argumentos um valor para x, um para y e outro para o raio, e deve alterar os atributos inicializando−os com os valores passados.

Você pode abstrair o uso dessa função como uma maneira de inicializar o objeto de uma só vez embora a função o faça seqüencialmente. Comente as vantagens de fazê−lo, comparando com as outras opções, tenha sempre em mente a questão de segurança quando avaliar técnicas diferentes de programação.

2)No programa anterior, verifique que nada impede que você acesse diretamente os valores de x , y e raio e os modifique. Como você pode criar um número enorme de funções : altera_x(float a); move_raio(float dr); seria desejável que somente essas funções pudessem modificar x, y e raio. Você verá que isso é possível em encapsulamento 1.3. Por hora, crie essas funções.

3)Teste a função membro move com argumentos negativos, exemplo ac.move(−1.0,−1.5);. O resultado é coerente?

1.2.2. MÉTODOS OU FUNÇÕES MEMBRO. 15

4)Crie uma nova struct que representa um ponto, que informações você precisa armazenar? Que funções seriam úteis? Faça um programa para testar sua classe.

5)Melhore a classe contador, defina uma função que imprime o contador na tela. Se você estivesse fazendo um programa para rodar numa interface gráfica com o usuário esta função de imprimir na tela seria a mesma? Definir uma função que retorna uma copia do valor atual do contador garante maior portabilidade? Por quê? Para aprender a retornar valores consulte: 1.2.3.

6)"Há uma tendência em definir o maior número de funções membro em uma classe, porque nunca se pode prever exatamente o seu uso em programas futuros". Comente esta frase, tendo em vista o conceito de portabilidade. Você já é capaz de citar outras medidas que tornem suas classes mais portáveis? Leia o exercício anterior.

1.2.3. FUNÇÕES MEMBRO QUE RETORNAM VALORES.......................................................

Até agora só tínhamos visto funções membro com valor de retorno igual a void. Uma função membro, assim como uma função comum, pode retornar qualquer tipo, inclusive os definidos pelo usuário. Sendo assim, sua chamada no programa se aplica a qualquer lugar onde se espera um tipo igual ou equivalente ao tipo do seu valor de retorno, seja numa lista de argumentos de outra função , numa atribuição ou num operador como o cout << variavel;

#include <iostream.h>

struct contador

//conta ocorrencias de algo

{

1.2.3. FUNÇÕES MEMBRO QUE RETORNAM VALORES. 16