Você está na página 1de 97

CURSO DE PS-GRADUAO LATO SENSU (ESPECIALIZAO) A DISTNCIA ADMINISTRAO EM REDES LINUX

INTRODUO LINGUAGEM C++

Antnio Maria Pereira de Resende

UFLA - Universidade Federal de Lavras FAEPE - Fundao de Apoio ao Ensino, Pesquisa e Extenso Lavras MG

PARCERIA UFLA Universidade Federal de Lavras FAEPE Fundao de Apoio ao Ensino, Pesquisa e Extenso REITOR Fabiano Ribeiro do Vale VICE-REITOR Antnio Nazareno Guimares Mendes DIRETOR DA EDITORA Marco Antnio Rezende Alvarenga PR-REITOR DE PS-GRADUAO Luiz Edson Mota de Oliveira COORDENADOR DE PS-GRADUAO LATO SENSU Antnio Ricardo Evangelista COORDENADOR DO CURSO Joaquim Quinteiro Ucha PRESIDENTE DO CONSELHO DELIBERATIVO DA FAEPE Antnio Eduardo Furtini Neto EDITORAO Grupo Ginux (http://ginux.comp.ufla.br/) IMPRESSO Grca Universitria/UFLA Ficha Catalogrca preparada pela Diviso de Processos Tcnicos da Biblioteca Central da UFLA Resende, Antnio Maria Pereira de Introduo Linguagem C++ / Antnio Maria Pereira de Resende. Lavras: UFLA/FAEPE, 2002. 105 p. : il. - Curso de Ps-Graduao Lato Sensu (Especializao) a Distncia: Administrao em Redes Linux Bibliograa. 1. Programa de Computador. 2. Linguagem de Programao. 3. Linguagem C++. 4. Linguagem C. 5. Informtica. I Universidade Federal de Lavras. II. Fundao de Apoio ao Ensino, Pesquisa e Extenso. III. Ttulo. CDD 005.133 Nenhuma parte desta publicao pode ser reproduzida, por qualquer meio ou forma , sem a prvia autorizao.

SUMRIO

1 Introduo 2 Fundamentos da Linguagem C++ 2.1 Histria do C++ . . . . . . . . . . . . . . . . . 2.2 Melhorias da Linguagem C++ Linguagem C 2.3 Primeiro Programa em C++ . . . . . . . . . . 2.4 Palavras-Chaves . . . . . . . . . . . . . . . . 2.5 Maisculas e Minsculas . . . . . . . . . . . 2.6 Comentrios . . . . . . . . . . . . . . . . . . 2.7 Biblioteca Padro C e C++ . . . . . . . . . . 2.8 Arquivos de Cabealho . . . . . . . . . . . . 2.9 Tipos de Dados . . . . . . . . . . . . . . . . . 2.10 Estruturas de controle de uxo . . . . . . . .

9 11 11 11 12 13 14 14 14 15 17 18 19 19 22 23 23 24 27 27 28 29 31 31 36 37 38 42 45 45 47 47 47 48 49 50 62 63

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

3 Operadores de I/O para dados 3.1 Operadores . . . . . . . . . . . . . . . . . . . . . . . 3.2 Controlando Flags de Fluxo de I/O (Manipuladores) 3.3 Funes-Membro de Entrada . . . . . . . . . . . . . 3.4 Funes-Membro de Sada . . . . . . . . . . . . . . 3.5 Observaes sobre E/S . . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

4 Funes em C++ 4.1 Funo inline (em linha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Sobrecarga de Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Programao Orientada a Objetos 5.1 Compreendendo a Orientao a Objetos a Partir de Structs 5.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Estrutura Simples de um Programa C++ . . . . . . . . . . . 5.4 Proteo de Informao . . . . . . . . . . . . . . . . . . . . 5.5 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6 Denies de Programao Orientada a Objetos . . . . . . 5.6.1 Classes . . . . . . . . . . . . . . . . . . . . . . . . . 5.7 Encapsulamento . . . . . . . . . . . . . . . . . . . . . . . . 5.8 Mensagem . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9 Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.10 Polimorsmo . . . . . . . . . . . . . . . . . . . . . . . . . . 5.11 Declarao dos Atributos . . . . . . . . . . . . . . . . . . . 5.12 Construtores e Destrutores de classe . . . . . . . . . . . . 5.13 Inicializando Variveis em Construtores . . . . . . . . . . . 5.14 Acesso a Variveis nas Classes . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

5.15 5.16 5.17 5.18 5.19 5.20 5.21 5.22 5.23 5.24 5.25 5.26 5.27 5.28 5.29 5.30 5.31 5.32

Objetos e Funes . . . . . . . . . . . . . . . . . . . . . . . . Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays de Classes . . . . . . . . . . . . . . . . . . . . . . . . Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Herana de Cdigos em C++ . . . . . . . . . . . . . . . . . . Classes Derivadas . . . . . . . . . . . . . . . . . . . . . . . . Herana Mltipla . . . . . . . . . . . . . . . . . . . . . . . . . Herana de Mltiplos Nveis . . . . . . . . . . . . . . . . . . . Compreendendo Herana pela Relao um e parte de Funes Virtuais . . . . . . . . . . . . . . . . . . . . . . . . . Funes Amigas . . . . . . . . . . . . . . . . . . . . . . . . . Classes Amigas . . . . . . . . . . . . . . . . . . . . . . . . . O ponteiro this . . . . . . . . . . . . . . . . . . . . . . . . . . Variveis Estticas (Static) . . . . . . . . . . . . . . . . . . . Funes-membro estticas . . . . . . . . . . . . . . . . . . . Sobreposio de Mtodos . . . . . . . . . . . . . . . . . . . . Sobreposio de Operadores . . . . . . . . . . . . . . . . . . Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

63 64 65 67 67 67 70 71 73 75 79 79 80 81 82 82 83 83 87 87 88 89 89 91 97

6 Leitura e gravao em arquivos 6.1 Gravao de Dados em um Arquivo . . . . . . . . . . . . . . . . . . . . . . . 6.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Biblioteca Padro de Gabaritos - STL 7.1 Arquivos de Cabealho de Conteineres da STL . . . . . . . . . . . . . . . . . 8 Exerccios Referncias Bibliogrcas

LISTA DE FIGURAS

2.1 Primeiro Programa em C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 3.6 Exemplo de Uso de E/S . . . . . . . . Exemplo de Uso de E/S . . . . . . . . Uso de Flags . . . . . . . . . . . . . . Uso de Funes-Membro de Entrada Uso de Funes-Membro de Entrada Uso de Funes-Membro de Sada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12 21 21 22 24 24 24 27 28 32 32 33 33 33 34 34 35 36 37 39 40 40 43 43 44 44 45 46 46 50 51 52 52 53 53 53 54 54 55

4.1 Uso de Funes Inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Uso de Sobrecarga de Funes . . . . . . . . . . . . . . . . . . . . . . . . . 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 5.21 5.22 5.23 5.24 5.25 5.26 5.27 5.28 5.29 5.30 Estruturas em C++ . . . . . . . . . . . . Usando a Estrutura Num . . . . . . . . . Acessando Dados de Num . . . . . . . . Uso de private . . . . . . . . . . . . . Erro em Acesso a Dados Privados . . . Estrutura Num . . . . . . . . . . . . . . . Variveis de uma Estrutura . . . . . . . Uso de class . . . . . . . . . . . . . . Declarando Classes . . . . . . . . . . . Estrutura Simples de um Programa C++ Classe Pilha . . . . . . . . . . . . . . . Uso da Classe Pilha . . . . . . . . . . . Uso da Classe Pilha . . . . . . . . . . . Objetos em um Processador de Textos . Reutilizao de Cdigo . . . . . . . . . Estrutura de um Objeto . . . . . . . . . Classes Documentos e Programas . . . Usando Herana . . . . . . . . . . . . . Implementao da Classe Arquivo . . . Usando Classes . . . . . . . . . . . . . Classe Triangulo . . . . . . . . . . . . . Classe Mensagem . . . . . . . . . . . . Usando Construtores Default . . . . . . Uso da Classe Pilha . . . . . . . . . . . Usando Construtores . . . . . . . . . . Declarando Objetos . . . . . . . . . . . Construtores com Parmetros . . . . . . Criando Variveis com Parmetros . . . Construtor da Classe Pilha . . . . . . . Redenio da Classe Pilha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.31 5.32 5.33 5.34 5.35 5.36 5.37 5.38 5.39 5.40 5.41 5.42 5.43 5.44 5.45 5.46 5.47 5.48

Chamada de Destrutores na Classe Pilha Criando objeto dinamicamente . . . . . . Classe Tempo . . . . . . . . . . . . . . . Criando Objetos da Classe Tempo . . . . Classe Tempo . . . . . . . . . . . . . . . Classe Aula . . . . . . . . . . . . . . . . . Construtor da Classe Aula . . . . . . . . . Classe Nome . . . . . . . . . . . . . . . . Inicializando Variveis-Membro . . . . . . Acesso a Variveis . . . . . . . . . . . . . Chamadas de Funes . . . . . . . . . . Array de Objetos . . . . . . . . . . . . . . Usando Herana . . . . . . . . . . . . . . Funes Amigas . . . . . . . . . . . . . . Classes Amigas . . . . . . . . . . . . . . Uso do Ponteiro This . . . . . . . . . . . . Variveis Estticas . . . . . . . . . . . . . Sobreposio de Operadores . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

55 56 56 57 57 59 60 61 62 63 64 66 68 79 80 81 82 84 87 88

6.1 Leitura de Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Escrita de Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

LISTA DE TABELAS

2.1 Palavras Chaves da Linguagem C . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Palavras-Chaves C++ no Encontradas em ANSI C . . . . . . . . . . . . . . 2.3 Arquivos de Cabealho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 Operadores em C++ . . . . . . Tipos de E/S em C++ . . . . . Caracteres Especiais . . . . . Manipuladores de Fluxo de E/S Funes-Membro de Entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13 13 16 19 20 21 22 23 35

5.1 Exemplos de Denies em Classes . . . . . . . . . . . . . . . . . . . . . . .

1
INTRODUO
O aluno do curso de Administrao de Redes Linux dever sair deste mdulo sendo capaz de ler um programa feito em C++ e identicar o que o mesmo faz. Desta forma o aluno ser capaz de determinar se um cdigo oferece risco de segurana para a rede. A princpio faremos uma breve introduo da histria da linguagem C++, mostrando tambm diferenas e alguns melhoramentos de C++ em relao a linguagem C. Tais informaes iro ajud-lo a descobrir no que consiste a linguagem C++ e perceber a facilidade de sua utilizao e semelhana com a linguagem C. Se voc conhece Pascal ou C, melhor ainda. No incio desse captulo mostra-se um simples programa em C++, e ao longo da apostila examinaremos uxos, manipuladores, constantes, variveis, entradas e sadas de dados, operadores, etc. Deve-se ver a linguagem C++ como uma extenso da linguagem C. Tudo o que se faz em C vale para C++, porm, a organizao do programa diferente. A linguagem C uma ferramenta que nos permite modelar o mundo como um conjunto de funes. Neste caso devemos ento observar o mundo, projetar funes e mape-las para dentro do computador. Agindo assim teramos funes para calcular o resultado de uma venda, para localizar um arquivo, para controlar um dispositivo eletrnico etc. Quando pensamos em linguagem C++, ns devemos mudar a maneira como vemos o mundo. O mundo deixa de ser um conjunto de funes e passa a ser um conjunto de objetos que se relacionam. Agindo assim teramos objetos como nota scal, pedido, dispositivo eletrnico etc. Para cada objeto deste devemos dizer quais so suas caractersticas e responsabilidades. Para quem no conhece a programao orientada a objetos, inicialmente, poder sentir diculdades para se desprender da programao estruturada, e ter o prazer de descobrir as facilidades e maravilhas que este paradigma oferece. Assim devemos ser pacientes e reservar algum tempo para estudar os exemplos e execut-los. As descobertas que voc far nesses momentos sero de valor inestimvel mais tarde. Por m trabalharemos com as melhorias em C++ no que tange a programao orientada a objetos, onde sero realizados exemplos do uso de classes, polimorsmo (fun-

10

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

es virtuais), funes amigas, encapsulamento de dados, herana, herana mltipla e de mltiplos nveis, sobreposio de operadores, etc.

2
FUNDAMENTOS DA LINGUAGEM C++
2.1 HISTRIA DO C++

A base terica para o desenvolvimento da teoria de orientao a objetos originou-se na rea de inteligncia articial. Atravs das tcnicas de representao de conhecimento, denominadas redes semnticas e quadros (frames), elaborou-se a teoria empregada nas linguagens orientadas a objetos como Smalltalk, Eiffel, Pascal, C++, Java etc. O desenvolvimento de C++ se deu em 1980 nos Laboratrios Bell por Bjarne Strousstrup. C++ originalmente foi desenvolvida para solucionar algumas simulaes motivadas por eventos, muito rigorosas, para as quais as consideraes sobre ecincia impediam o uso de outras linguagens. C++ foi utilizada primeiramente fora do grupo de desenvolvimento de linguagem do Dr. Strousstrup em 1983 e, no vero de 1987, a linguagem estava ainda passando por um renamento e evoluo naturais. Em 1983, foi criado um comit na American National Standards Institute ANSI para produzir um padro da linguagem C. Em 1989, foi aprovado o padro da linguagem. Em uma cooperao com a International Standards Organization - ISO, foi publicado uma padronizao internacional da linguagem em 1990 no documento ANSI/ISO 9899:1990. Ainda nesse ano, o ANSI e o ISO uniram foras pra padronizar o C++. Em 1995 foi lanado uma verso preliminar do padro e uma segunda verso em dezembro de 1996. A proposta preliminar de padro internacional nal foi publicada em novembro de 1997. O padro internacional em si foi adotado em junho de 1998.

2.2

MELHORIAS DA LINGUAGEM C++ LINGUAGEM C

Alguns melhoramentos (no orientadas para objetos) linguagem C Comentrios Nomes de sries Nomes de estruturas ou classes Especicador const

12

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

Modelagem de funo Sobrecarga de funo Especicador inline Operadores new e delete Ponteiros void e funes que retornam void

Alguns melhoramentos (orientados para objetos) Classes e encapsulamento de dados Construtores e destrutores Mensagens Funes amigas Sobrecarga de operador Classes derivadas Polimorsmo usando funes virtuais Biblioteca de streams (classes cin, cout, cerr)

2.3

PRIMEIRO PROGRAMA EM C++

A Figura 2.1 apresenta um primeiro programa em C++. Nota-se que a principal diferena o nome de arquivo da instruo #include, passou de stdio.h (standard input output) usada no C, para iostream.h (input output stream) usada no C++, com a outra alterao envolvendo uma chamada de sada diferente, cout, enquanto em C utilizaramos printf. Observa-se ainda que para mudar de linha utilizou-se o endl, porm, ainda podese usar o \n junto a string para mudar de linha. Assim, poderia-se ter o comando: cout Al pessoal!\n;
//Seu primeiro exemplo de programa C++ #include <iostream.h> main() { cout << "Al pessoal!" << endl; }

Figura 2.1: Primeiro Programa em C++

Fundamentos da Linguagem C++

13

2.4

PALAVRAS-CHAVES

Palavras-chave so identicadores predenidos que possuem signicados especiais para o compilador. Exemplos de palavras-chave incluem: char, float, signed, void, double etc. Esses so smbolos que no podemos usar para nossos prprios propsitos, pois possuem signicados especiais para o compilador e no podem ser modicados. Pode-se us-las apenas como foram denidas. Lembre-se o nome de um identicador de programa no pode ter a mesma ortograa e tipo de letra que uma palavra-chave C. As palavras chave da linguagem C esto listadas nas tabelas 2.1 e 2.2.
Tabela 2.1: Palavras Chaves da Linguagem C

auto break case cdecl char const continue default do double else enum extern

far oat for goto huge if int interrupt long near pascal register return

short signed sizeof static struct switch typedef union unsigned void volatile while

Tabela 2.2: Palavras-Chaves C++ no Encontradas em ANSI C

asm bool catch class const_cast delete dynamic_cast explicit

false friend inline mutable namespace new operator private

protected public reinterpret_cast static_cast template this throw

true try typeid typename using virtual wchar_t

14

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

2.5

MAISCULAS E MINSCULAS

Assim como a linguagem C, o C++ sensvel ao tipo de letra utilizado (distingue maisculas de minsculas). Isso signica que, por exemplo, as variveis auxvar e auxVar so diferentes.

2.6

COMENTRIOS

Todo comentrio em C++ pode ser comeado por /* e prosseguindo da esquerda para a direita at alcanar o smbolo */. O compilador ignora tudo que estiver entre esses smbolos. Existe ainda um segundo modo de se fazer comentrios em C++, o qual no est disponvel em C, podendo ser feito com duas barras //, como por exemplo: a) exemplo de comentrio de bloco
/* Este um exemplo de se fazer comentrio de bloco na linguagem C. Ou seja, comentrio de mais de uma linha O comentrio acaba aps encontrar o asterisco barra. */

b) exemplo de comentrio de linha


// Este um exemplo de comentrio de linha. // Aps o compilador encontrar as duas barras ele ignora // o resto da linha // Assim voc pode ter uma linha comeada por comando // e depois vir o comentrio. cout << "Alo Pessoal!"; // O compilador ignora texto aps "//"

c) exemplo dos misturando os tipos de comentrios


cout << var1 << /* comentrio*/ << var2; // comentrio de linha

2.7

BIBLIOTECA PADRO C E C++

Seria uma perda de tempo se cada programador tivesse que idealizar e codicar uma rotina para calcular a raiz quadrada e depois tivesse que incorporar a rotina no programa. C e C++ resolvem estas diculdades fornecendo ao programador bibliotecas de funes que executam clculos comuns. Com o auxlio das bibliotecas, necessria apenas uma nica instruo para invocar a funo. A lista a seguir destaca as categorias de bibliotecas fornecidas pelo compilador C++:

Fundamentos da Linguagem C++

15

Rotinas de classicao Rotinas de converso Rotinas de controle Rotinas matemticas Rotinas de manipulao Rotinas de alocao de memria Rotinas de exibio de janela de texto Rotinas de hora e data Rotinas de controle de diretrio Rotinas grcas Rotinas de entrada e sada Rotinas padro A maioria das funes de biblioteca destina-se a usar informaes contidas em arquivos especiais que so fornecidos com o sistema. Portanto estes arquivos devero ser includos quando voc usar as funes de biblioteca. Estes arquivos so fornecidos tambm com o compilador C++. Eles tm geralmente a extenso .h e so chamados de arquivos de cabealho (header files)

2.8

ARQUIVOS DE CABEALHO

A maioria dos programas e listagens precedentes, utilizados como exemplo, incluem uma linha geralmente no incio do arquivo, como a que segue:
#include <iostream.h>

A extenso .h pode ser suprimida para as bibliotecas ANSI, que vem junto com o compilador. Os arquivos de cabealho normalmente terminam com a extenso .h ou .hpp. Arquivos de cabealho contm tipicamente declaraes, denies e outras instrues necessrias para vrios programas. O resultado de incluirmos um arquivo de cabealho o mesmo daquele se inclussemos o texto do arquivo nessa mesma posio. Essa estratgia economiza espao, pois voc no precisa copiar as linhas do iostream.h (como no exemplo), em todos os programas escritos. Pode-se tambm incluir diretivas como:
#include <stdio.h> #include "programa.h" #include "material.cpp"

16

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

O primeiro exemplo inclui um arquivo denominado # armazenado no diretrio de include (sempre utilize sinais de menor e maior para incluir arquivos de cabealho padronizados fornecidos pelo seu compilador). O segundo e o terceiro exemplo incluem arquivos denominados programa.h e material.cpp. 1 Como esses nomes esto delimitados por aspas duplas, em vez do sinal de maior e menor, o compilador procura pelos arquivos no diretrio ativo. Outra observao que as bibliotecas feitas para a linguagem C padro foram refeitas para aproveitar os benefcios da linguagem C++. Voc pode ento utilizar a biblioteca stdio.h, porm, aconselha-se utilizar a cstdio que a mesma biblioteca otimizada para o C++. Para poder utilizar a biblioteca otimizada basta digitar o nome da bilioteca padro da linguagem C e acrescentar a letra c como o primeiro caracter do nome da bibloteca. Este o padro adotado. Assim teramos, cfloat, climits, cmath etc. A Tabela 2.3 apresenta uma lista de alguns arquivos de cabealho fornecidos com o C++ padro. Tabela 2.3: Arquivos de Cabealho (includes) cassert cctype Descrio Contm macros e informaes para adicionar disgnsticos que ajudam o programador a realizar depurao. Contm prottipos para funes que examinam caracteres em busca de determinadas propriedades dos caracteres e para funes que podem ser usadas para converter letras minsculas em maisculas e viceversa. Contm limites do sistema para o tamanho dos nmeros de ponto utuante. Contm os limites do sistema para os tamanhos dos nmeros inteiros. Contm prottipos de funes da biblioteca matemtica. Contm prottipos de funes da biblioteca padro de entrada/sada e as informaes utilizadas por elas. Contm prottipos de funes para converso de nmeros em texto e texto em nmeros, alocao de memria, nmeros aloeatrios e outras funes comvrias nalidades.

coat climits cmath cstdio cstdlib

Observe que apesar de voc poder incluir um arquivo com extenso diferente de .h ou .hpp, isso no considerado como boa prtica.

Fundamentos da Linguagem C++

17

(includes) cstring

Descrio Contm prottipos de funes para processamento de strings ctime Contm prottipos e tipos de funes para manipular horrios e datas. iostream Contm prottipos de funes para funes padres de entrada e sada. iomanip Contm prottipos de funes para os manipuladores de streams que permitem formatao de streams de dados. fstream Contm prottipos de funes para funes que executam operaes de entrada a partir de arquivos em disco e sada para arquivos em disco. utility Contm classes e funes que so usadas por muitos arquivos de cabealho de biblioteca padro. vector, list, deque,queue, Os arquivos de cabealho contm classes que implestack, smap,set, bitset mentam contineres da biblioteca padro. Contineres so usados para armazenar dados durante a execuo de umprograma.

2.9

TIPOS DE DADOS

Todas as variveis possuem uma caracterstica em comum: um tipo de dados associado. Isso signica que, alm de escolhermos um nome apropriado para a varivel, devemos tambm dizer ao compilador que tipo de informao deseja-se armazenar. Os tipos vlidos para a linguagem C so os mesmos para a linguagem C++. Dentre eles cita-se char, int, float, double, void. E os modicadores de tamanho unsigned, short e long. Uma observao importante que nem todas as verses do C++ armazenam as variveis obrigatoriamente no mesmo nmero de bytes. Por isto, leia a documentao do seu compilador para saber o tamanho de bytes que ele reserva para cada tipo de varivel. Abaixo, alguns exemplos do uso de variveis em C++:
long populacao, conta; int agencia, fone; long populacao = 5000; long conta = 124243;

18

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

Aqui o sinal de igual interpretado pelo compilador como uma instruo para atribuir o valor direita para a varivel esquerda. Mais a frente quando estivermos fazendo os programas de exemplos retomaremos a discusso sobre variveis em C++.

2.10

ESTRUTURAS DE CONTROLE DE FLUXO

No existe nenhuma diferena das estruturas de controle utilizadas no C e C++. Portanto, o que voc aprendeu no mdulo anterior sobre os comandos if, switch, while, do while, for, continue e break so vlidos de modo idntico na programao C++.

3
OPERADORES DE I/O PARA DADOS
3.1 OPERADORES

C++ repleto de operadores smbolos que executam vrias operaes sobre seus argumentos. Alm dos usuais + (mais), - (menos), / (diviso) e * (multiplicao), existem 16 operadores que criam funes, operadores para vetores, operadores que incrementam e decrementam valores e operadores mais complexos que executam mais do que uma tarefa de uma s vez. A Tabela 3.1 apresenta operadores disponveis em C++. Tabela 3.1: Operadores em C++ Operador () [] -> . ++/-~ ! & * (type) sizeof * / % + << >> Descrio Expr. de funo Expr. Arranjo Struct indireto Struct membro Incremento/decremento Complemento de l Unrio NOT Endereo Ref. Indireta Cast Tamanho em bytes Multiplicao Diviso Resto Adio Subtrao Desloc. Esquerda Desloc. Direita Associa pela esquerda esquerda esquerda esquerda direita direita direita direita direita direita direita esquerda esquerda esquerda esquerda esquerda esquerda esquerda

20

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

Operador Descrio < Menor que <= Menor ou igual > Maior que >= Maior ou igual == Igual != No igual & Bit a bit AND ^ Bit a bit XOR | Bit a bit OR && AND lgico || OR lgico ?: Condicional =\% = += Atribuio

Associa pela esquerda esquerda esquerda esquerda esquerda esquerda esquerda esquerda esquerda esquerda esquerda direita esquerda

Um uxo de E/S uma seqncia do uxo de caracteres escritos para o vdeo ou lidos do teclado. Ao realizar operaes padres de entrada e sada em C++, normalmente usa os uxos de E/S cin para entrada e cout para sada. Da forma como foi projetado, C++ dene uxos de entrada e sada como classes. As denies dos arquivos so encontradas nos arquivos de cabealho iostream.h ou no istream.h e no ostream.h. Os tipos de E/S existentes so apresentados na Tabela 3.2.
Tabela 3.2: Tipos de E/S em C++

Fluxo cin cout cerr clog

Exemplo cin nome; cout "teste de sada;" Dispositivo padro (sada cerr "Erro crde erro) tico!"; Sada bufferizada para clog "msg erro!"; sada padro de erro (stderr)

Propsito Entrada de teclado (stdin) Sada de dados (stdout)

As guras 3.1 e 3.2 apresentam programas que usam cout para exibir mensagens e cin para atribuir letras digitadas a uma varivel. Ao realizar sada para cout, cerr ou clog pode-se usar os caracteres especiais da Tabela 3.3.

Operadores de I/O para dados

21

#include <iostream.h> void main(void) { cout << "Testando entrada e sada em C++" << endl; }

Figura 3.1: Exemplo de Uso de E/S

#include <iostream.h> void main(void) { char nome[64]; cout << "Digite Nome: "; cin >> nome; cout << "Nome digitado: " << nome; }

Figura 3.2: Exemplo de Uso de E/S

Tabela 3.3: Caracteres Especiais

Caractere \a \b \f \n \t \v \\ \? \ \0 \ooo \xhhh

Propsito Alerta Backspace Avano de pgina Caractere de nova linha (equivalente endl) Tabulao horizontal Tabulao vertical Backslash Ponto de interrogao Aspas simples Caractere nulo Valor octal, tal como \0333 Valor hexadecimal, tal como \x1B

22

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

3.2

CONTROLANDO FLAGS DE FLUXO DE I/O (MANIPULADORES)

Um manipulador de uxo um item atravs do qual ltra-se a sada de um uxo de E/S. Por exemplo, trs comuns manipuladores so hex, oct, dec os quais permitem que voc exiba valores em hexadecimal, octal e decimal. Alguns manipuladores de uxo de E/S permanecem em efeito aps uma operao de E/S completar. A Tabela 3.4 apresenta alguns manipuladores de uxo de E/S em C++.
Tabela 3.4: Manipuladores de Fluxo de E/S

Manipulador dec oct hex setbase setiosflags setfill setprecision

Efeito Exibe um valor em decimal Exibe um valor em octal Exibe um valor em hexadecimal Dene uma base de converso Manipular diversos tipos de arquivos Permite especicar largura mnima utilizada para exibir um campo de valor Controlar o nmero dos dgitos exibidos

Ao exibir valores de ponto utuante, existem situaes nas quais deseja-se exibir valores utilizando um formato decimal xo, tal como 345.452, enquanto que em outras vezes, deseja-se exibir valores em formato cientico exponencial, tal como 2.12343e4. O manipulador setiosflags por exemplo, possibilita controlar muitos flags, tais como: ios:fixed e ios:scientific. Esses deixam que voc controle a sada em ponto utuante de um programa. A Figura 3.3 apresenta um programa que faz uso de destes dois ags de formatao.
#include <iostream.h> #include <iomanip.h> void main(void) { cout << setiosflags(ios::fixed) << 234.45 << endl; cout << 23445.8967 << endl; cout << resetiosflags(ios::fixed); cout << setiosflags(ios::scientific) << 234.45 << endl; cout << 23445.8967 << endl; }

Figura 3.3: Uso de Flags

Operadores de I/O para dados

23

3.3

FUNES-MEMBRO DE ENTRADA

Os programas mais simples utilizam-se do cin e do operador de insero (>>) para realizar operaes de entrada. medida que seus programas tornam-se mais complexos sobre as operaes de entrada, voc necessitar de um controle mais rigoroso do que o operador de insero pode oferecer. Em tais casos, nossos programas podem utilizar funes-membro de entrada aqui discutidas. As principais funes-membro so apresentadas na Tabela 3.5.
Tabela 3.5: Funes-Membro de Entrada Funo Membro gcount getline get eof peek putback ignore Efeito Determinar a quantidade de caracteres extrados Ler uma linha de texto at encontrar retomo de carro (default) Realizar entrada de um caracter por vez Detectar o m de arquivo (m de uma entrada redirecionada) Ler caracteres at que um especco caracter seja encontrado Colocar um caracter qualquer dentro do buffer de entrada Ignorar caracteres at que uma dada condio seja satisfeita

A Figura 3.4 mostra um programa que usa a funo-membro getg para ler entrada redirecionada de um caracter por vez, convertendo a entrada para letras maisculas, no decorrer usa a funo eof para detectar o m do arquivo (m da entrada direcionada). O exemplo mostrado na Figura 3.5, por sua vez, faz uso de da funo-membro getline. Esse programa termina a primeira operao de entrada em um caracter X. A seguir, o programa realiza uma segunda operao de entrada.

3.4

FUNES-MEMBRO DE SADA

Fluxos de entrada oferecem algumas funes-membro que os programas podem utilizar para realizar operaes de E/S. De forma anloga analisaremos aqui as funesmembro de uxo de sada. O cout um objeto do tipo ostream. Como tal, suporta algumas funes-membro. O programa apresentado na Figura 3.6 utiliza a funo-membro put para exibir uma letra por vez no vdeo. Outras funes-membro de uxo de sada so: flush, flags, setf, unsetf, etc.

24

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

#include <iostream.h> #include <ctype.h> void main(void) { char letra; while (!cin.eof()) { letra = cin.get(); letra = toupper(letra); cout << letra; } }

Figura 3.4: Uso de Funes-Membro de Entrada

#include <iostream.h> void main(void) { char linha[l28]; cout << "Digite uma linha do texto e pressione <ENTER>" << endl; cin.getline(linha, sizeof(linha), X); cout << "Primeira linha: " << linha << endl; cin.getline(linha, sizeof(linha)); cout << "Segunda linha: " << linha; }

Figura 3.5: Uso de Funes-Membro de Entrada

#include <iostream.h> void main(void) { char letra; for (letra = A; letra <= Z; letra++) cout.put(letra); }

Figura 3.6: Uso de Funes-Membro de Sada

3.5

OBSERVAES SOBRE E/S O compilador utiliza arquivos de cabealho, ios, istream, ostream (funes-membro e variveis do uxo) para denir os uxos de E/S. Manipuladores so elementos que voc pode colocar em um uxo de entrada ou de sada para controlar a formatao de sua E/S. O arquivo de cabealho iomanip.h dene os manipuladores disponveis.

Operadores de I/O para dados

25

O uxo de sada cout realiza sada bufferizada, o que signica que sua sada no realmente escrita at que o buffer esteja completamente preenchido, o programa termine, o programa esvazie, ou no caso do cout, os programas realizem uma operao de entrada. Todo programa que voc criar, indiferente de seu propsito, sempre ir realizar algum tipo de operao de entrada e sada, portanto torna-se indispensvel entender uxos de E/S e suas capacidades.

26

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

4
FUNES EM C++
C++ oferece caractersticas especiais para funes. A codicao para uma funo em linha (inline) copiada onde a funo chamada no programa. Colocando-se a codicao no ponto de chamada da funo, consegue-se economizar tempo de execuo em funes pequenas chamadas com freqncia. C++ permite tambm a sobrecarga de funo, que possibilita se dar o mesmo nome de funo a vrias funes. Os modelos individuais de funo so reconhecidos pelo seu tipo e pela lista de argumentos, no exatamente pelo nome. til onde uma funo precisa funcionar com diferentes tipos de dados.

4.1

FUNO INLINE (EM LINHA)

A palavra-chave inline (em linha) uma diretiva, para que o compilador C++ insira uma funo em uma linha, como ilustrado na Figura 4.1.

#include <iostream.h> void imprime(void); main() { for(int i=O; i<l0; i++) imprime(); return O; } inline void imprime(void) { cout << "Exemplo de uma funo em linha\n"; }

Figura 4.1: Uso de Funes Inline

28

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

4.2

SOBRECARGA DE FUNES

O exemplo apresentado na Figura 4.2 ilustra a sobrecarga de funo. Note que duas funes com mesmo nome so modeladas dentro do mesmo escopo. A funo correta ser selecionada com base nos argumentos fornecidos.
#include <iostream.h> #include <iostream.h> int multiplica(int matriz[]); double multiplica(double matriz[]); main() { int matriz1[5] = {1, 2, 3, 4, 5}; double matriz2[5] = {1.2, 2.1, 3.5, 5.5, 6.5}; int prodl = multiplica(matriz1); double prod2 = multiplica(matriz2); cout << "Produto de numeros inteiros: " << prodl << endl; cout << "Produto dos numeros double: " << prod2 << endl; return 0; } int multiplica( int matriz [ ] ) { int temp; temp = matriz[0]; for(int i=1; i<5; i++) temp *= matriz[i]; return(temp); } double multiplica( double matriz [ ] ) { double temp; temp = matriz[0]; for(int i=1; i<5; i++) temp *= matriz[i]; return(temp); }

Figura 4.2: Uso de Sobrecarga de Funes

Existem algumas coisas que tm que ser evitadas quando se sobrecarrega uma funo. Por exemplo, se uma funo somente difere do tipo (e no nos argumentos), ela no pode ser sobrecarregada. Uma funo sobrecarregada, tambm no aceita a seguinte lista de argumentos:

Funes em C++

29

double cargafuno ( int valor ) double cargafuno ( int & numero )

Esta lista de argumentos no seria permitida porque cada funo aceitaria o mesmo tipo de argumentos. A sobrecarga de funes ser discutida novamente quando estivermos trabalhando com classes, especicamente com funes-membro de classes.

4.3

EXERCCIOS

Construa um programa que possua as funes (operaes) Mnimo e Mximo. Estas funes devem retornar o maior valor ou o menor valor dado dois parmetros. Quando vetor ou matriz deve haver comparao posio a posio. As possveis chamadas de funo so: a) Funo ( int , int ) // inteiros como parmetros b) Funo ( oat , oat ) // nmeros reais como parmetros c) Funo ( int[] , int[] ) // vetlores de inteiros como parmetros d) Funo ( oat[] , oat[] ) // vetores de reais como parmetros e) Funo ( int[][] , int[][] ) // matrizes de inteiros como parmetros f) Funo ( mat[] , mat[] ) // matrizes de reais como parmetros

30

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

5
PROGRAMAO ORIENTADA A OBJETOS
A programao orientada por objetos baseada na escrita de programas em termos de objetos (coisas) que compe um sistema. Um objeto representa uma entidade do mundo real (coisa) que pode armazenar dados (variveis-membros) e possui um conjunto especico de operaes (funes-membro) que so realizadas nele, ou ainda, um conjunto de dados e procedimentos para trabalhar com esses dados. As funes-membros, tambm conhecidas como mtodos, denem o que pode ou no ser feito com os dados. Uma vez que em um sistema objetos armazenam tipos especcos de informao e operaes especcas, o primeiro passo na criao de um programa baseado em objetos identicar os objetos do sistema, a informao chave do objeto e as operaes realizadas nos objetos. A programao orientada para objetos uma tcnica relativamente nova para a concepo e implementao de sistemas de software, centraliza-se nos principais conceitos: tipos de dados abstratos e classes, hierarquias de tipos (subclasses), herana e polimorsmo. Acredita-se que o ponto marcante da programao orientada para objetos seja a possibilidade de se reutilizar cdigo, ou seja, um objeto pode usar as implementaes de um outro objeto e estend-las para alcanar um objetivo especco. Quando se trabalha com orientao para objeto, todos os objetos so organizados em classes. So denidas classes bases e estas so estendidas de forma a criar novas classes, o que torna o programa muito fcil de ser documentado e entendido. O principal objetivo da programao orientada para objetos aumentar a produtividade do programador atravs de uma maior reutilizao de software, alm de diminuir a complexidade e o custo da manuteno do mesmo.

5.1

COMPREENDENDO A ORIENTAO A OBJETOS A PARTIR DE STRUCTS

Em C++, alm de dados, uma estrutura (struct) pode conter funes, como ilustrado na Figura 5.1.

32

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

struct Num { int n; int get() { return n; } void put(int i) { n = i; } };

Figura 5.1: Estruturas em C++

Agora, a estrutura Num contm 3 campos: um dado (n) e dois so funes (get e put). Estas funes so usadas como o campo n, como mostra a Figura 5.2
void main() { Num x; x.put(10); cout << x.get(); }

Figura 5.2: Usando a Estrutura Num

Observe que na instruo "x.put(10)", a funo put que est dentro de Num executada. Esta funo possui a instruo n = i onde i o parmetro. E n ? Esta varivel um dos campos da estrutura. Porm, uma estrutura s dene um tipo, no dene uma varivel. Esta varivel n o campo n de x, pois x que foi usado para executar put. Assim, "x.put(10)" coloca 10 no campo n de x, sendo equivalente a "x.n = 10". Do mesmo modo, "x.get()" retorna o campo n de x. O fato de uma estrutura possuir funes para manipular seus campos (get e put para manipular n) no impede que os campos (ex.: n) sejam manipulados diretamente, o que ilustrado pela Figura 5.3 Como veremos adiante, este um fato indesejvel (acesso direto a variveis), que pode ser impedido com a palavra chave private. Quando colocada dentro de uma estrutura, private torna privado todos os campos que se seguem a ele, pelo menos at se encontrar a palavra chave public. Um campo privado s pode ser manipulado pelas funes da classe, sendo erro de compilao o seu uso fora dela. Como exemplo, tem-se o cdigo da Figura 5.4 da estrutura Num usando private. Isso faz n ser privado e get e put pblicos. Um campo pblico como qualquer membro normal de uma estrutura, podendo ser usado em qualquer lugar. Como n privado, o cdigo apresentado na Figura 5.5 leva a um erro de compilao em "x.n = 10". Se a estrutura for denida como apresentado na Figura 5.6, teremos get e n pblicos e put privado. Neste caso, a instruo "x.put(10)" do programa acima que causaria

Programao Orientada a Objetos

33

struct Num { int n; int get() { return n; } void put(int i) { n = i; } }; void main() { Num x; x.n = 10; // manipula n diretamente cout << x.get() << " " << x.n; }

Figura 5.3: Acessando Dados de Num


struct Num { private: int n; public: int get() { return n; } void put(int i) { n = i; } };

Figura 5.4: Uso de private


void main() { Num x; x.n = 10; // erro ! x.put(10); }

Figura 5.5: Erro em Acesso a Dados Privados

um erro de compilao. Note que, a menos que se diga o contrrio, todos os membros da estrutura so pblicos (veja a declarao de n em Num). Outro ponto importante ilustrado na Figura 5.7. Ela ilustra o fato que, se o programador declarar duas variveis de Num, estas possuiro dois campos n, e as funes get e put agiro sobre campos n diferentes. Uma estrutura que possui campos que so funes chamada de classe. As funes que so campos de uma classe so chamadas de mtodos. Os campos que so dados so chamados de variveis de instncia. Cada varivel de uma classe (como x e y da Figura

34

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

struct Num { int n; // publico private: void put(int i) { x = i; } public: int get() { return n; } };

Figura 5.6: Estrutura Num

#include <iostream.h> struct Num { private: int n; public: int get() { return n; } void put(int i) { n = i; } }; void main() { Num x,y; x.put(10); // equivalente a y.put(20); // equivalente a cout << x.get() << endl; // cout << y.get() << endl; // }

x.n = 10 y.n = 20 equivalente a x.n equivalente a y.n

imprime 10 imprime 20

Figura 5.7: Variveis de uma Estrutura

5.7) possui um valor, assim como um inteiro i possui um valor 3 ou 20. Este valor chamado de objeto. Assim, x e y contm um objeto, assim como o inteiro i pode conter o valor 3. Para simplicar, diz-se "objeto x" ao invs de "objeto contido na varivel x". A instruo "x.put(10)" o envio da mensagem "put(10)" ao objeto x. Um envio de mensagem similar a uma chamada de funo. Na terminologia de C++, variveis de instncia so dados membro (data members) e mtodos so funes membro (function members). A Tabela 5.1 exemplica algumas das denies dadas anteriormente. Uma classe pode tambm ser declarada pela palavra chave class, como ilustra a Figura 5.8. A diferena entre class e struct que na primeira (class) a princpio todos os membros (variveis de instncia e mtodos) so privados, enquanto que com struct a

Programao Orientada a Objetos

35

Tabela 5.1: Exemplos de Denies em Classes

Identicador Num n get e put xey

Funcionalidade no programa classe varivel de instncia de Num mtodos de Num variveis que contm objetos (objetos x e y, para simplicar) envios de mensagem, chamada de funo membro.

x.put(10), y.put(20), x.get() e y.get().

class Num { private: int n; public: int get() { return n; } void put(int i) { n = i; } };

Figura 5.8: Uso de class

princpio todos os membros so pblicos. Assim, as classes A apresentadas na Figura 5.9 so equivalentes. Ou seja, uma classe
struct Complexo { double re, im; }

equivalente a
class Complexo { public: double re, im; };

36

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

class A { int n; public: int m; }; struct A { private: int n; public: int m; };

Figura 5.9: Declarando Classes

Se esta classe for declarada como


class Complexo { double re, im; };

as variveis de instncias re e im no podem ser manipuladas por ningum (no h mtodos para Complexo), pois so privadas:
void main() { Complexo w; w.re = 3.14; // erro de compilacao w.im = 2.0; // erro de compilacao }

5.2

EXERCCIOS

1. Construa uma struct contendo os dados de um cliente (nome, endereo, salrio, idade) e dentro desta struct construa os mtodos para ler estes valores, imprimi-los na tela. Construa ainda funes para imprimir qual o cliente mais novo, mais velho, o que ganha mais e o que ganha menos. Na funo principal do programa crie alguns clientes e faa o teste das funes. 2. Converta o programa acima para uma classe e faa os testes novamente. (no se esquea de que a extenso dos programas que declaram classes deve ser CPP e no mais C). A partir deste momento voc comear a programar orientado a objetos. 3. Construa uma classe chamada data. Esta classe possui as operaes somar e subtrair datas.

Programao Orientada a Objetos

37

5.3

ESTRUTURA SIMPLES DE UM PROGRAMA C++

//Insero de bibliotecas #include <biblioteca.h> // Declarao da classe class NomedaClasse { private: //Atributos int i, j; public: // Declarao dos construtores da classe // Pode-se ter mais de um construtor desde que os tipos e // quantidade dos parmetros sejam diferentes public NomeDaClasse () { // implementao do construtor } public NomeDaClasse (int a) { // implementao do construtor } // Declarao do Destrutor da classe // A classe pode ter apenas um Destrutor que no recebe parmetro // O smbolo ~ indica que a funo um destrutor. public ~NomeDaClasse () { // implementao do destrutor } // Mtodos (funes) do programa void funo1() { // implementao do mtodo } double void funo2( int a, char *string, float b) { // implementao do mtodo }

Figura 5.10: Estrutura Simples de um Programa C++

38

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

Os programas em C++ possuem, basicamente, a declarao da classe, dos atributos e dos mtodos (como exemplicado na Figura 5.10). Os mtodos por sua vez podem ser denominados construtores, destrutores e simplesmente mtodos. Esta denio depende da nalidade do mtodo. Os construtores so responsveis alocar um objeto na memria que possua a estrutura da classe declarada. O nome dos consrutores deve ser igual ao da classe. Se os objetos criado estaticamente, seu destrutor chamado implicitamente ao trmino do escopo da varivel. para destruir o objeto criado e liberar a memria. O nome do destrutor deve ser igual ao da classe precedido pelo smbolo ~. Os outros mtodos que no so construtores e nem destrutores denominam-se, simplesmente, mtodos. A maior diculdade enfrentada pelos aprendizes de orientao a objetos no est na linguagem, mas, na grande diculdade em mudar o estilo de pensar no problema e modello no computador. O mundo deve ser visto como um conjunto de objetos que interagem entre si. Tudo resumido a objetos, o cachorro, o gato, o cliente, a conta, o produto, a ta de vdeo, o pedido etc. Quando o aluno aprender a visualizar o mundo como um conjunto de objetos que se relacionam ento ele ser capaz de entender e programar orientado a objetos independente da linguagem.

5.4

PROTEO DE INFORMAO

Um outro exemplo de classe dado na Figura 5.11. Uma pilha uma estrutura de dados onde o ltimo elemento inserido, com empilhe, sempre o primeiro a ser removido, com desempilhe. Esta estrutura espelha o que geralmente acontece com uma pilha de objetos quaisquer. O programador pode usar esta classe como nos programas apresentados nas guras 5.12 e 5.13 Usar proteo de informao impedir o acesso direto aos atributos (variveis) da classe elas s so manipuladas (alteradas) por meio de mtodos. Esta uma regra indispensvel para a boa programao orientada a objetos. Portanto, voc deve declarar os atributos de sua classe como private e para cada atributo voc deve criar os mtodos set e get para permitir que eles possam ser consultados e alterados. No exemplo da Pilha, o programador que usa esta classe, s pode manipular os atributos indiretamente. Se tentar fazer uma chamada direta a um dos atributos o compilador acusar erro. Experimente colocar a linha abaixo dentro do mtodo main: p.vet[++p.topo] = 30; // erro de compilacao

Programao Orientada a Objetos

39

const Max = 100; class Pilha { private: int vet[Max], topo; public: boolean crie() { topo = 1; return true; } boolean empilhe(int elem) { if ( topo != Max ) { vet[++topo] = elem; return true; } else return false; } boolean desempilhe(int &elem){ if ( topo != 0 ) return false; else { elem = vet[topo]; return true; } } boolean vazia() { return topo != 0; } } // fim Pilha

Figura 5.11: Classe Pilha

40

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

void main() { Pilha p, q; int i; p.crie(); p.empilhe(1); // despreza o valor de retorno p.empilhe(2); p.empilhe(3); }

Figura 5.12: Uso da Classe Pilha

/* O proximo while imprimir 3 2 1 */ while ( ! p.vazia() ) { p.desempilhe(i); cout << i << endl; } q.crie(); q.empilhe(10); if ( ! p.empilhe(20) ){ erro(); // ... }

Figura 5.13: Uso da Classe Pilha

Programao Orientada a Objetos

41

A proteo de informao possui 3 vantagens: 1. Torna mais fcil a modicao de representao da classe, isto , a estrutura de dados usada para implementao. No caso de Pilha, a implementao um vetor (vet) e um nmero inteiro (topo). Suponha que o projetista de Pilha mude a estrutura de dados para uma lista encadeada, retirando o vetor vet e a varivel topo:
enum boolean { false, true }; class Pilha { private: Elem *topo; public: boolean crie() { topo = NULL; return true; } boolean empilhe(int elem) { Elem *w = new Elem; if ( w == NULL ) return false; w->n = elem; w->suc = topo; topo = w; return true; } // empilhe boolean desempilhe(int &elem ) { if ( topo == NULL ) return false; else { elem = topo->n; Elem *w = topo; topo = topo->suc; delete w; return true; } } // desempilhe boolean vazia() { return topo == NULL; } // vazia }; // pilha

O que foi modicado foi o cdigo dos mtodos, no o prottipo deles. Assim, todo o cdigo de main do ltimo programa no ser afetado. Por outro lado, se o usurio tivesse declarado vet e topo como pblicos e usado p.vet[++p.topo] = 30 para

42

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

empilhar 30, haveria um erro de compilao com a nova representao de Pilha, pois esta no possui vetor vet. E o campo topo um ponteiro, no mais um inteiro. 2. O acesso aos dados de Pilha (vet e topo) por mtodos tornam a programao de mais alto nvel, mais abstrata. Lembrando, abstrao o processo de desprezar detalhes irrelevantes para o nosso objetivo, concentrando-se apenas no que nos interessa. Nesse caso, a instruo p.push(30) mais abstrata do que p.vet[++p.topo] = 30 porque ela despreza detalhes irrelevantes para quem quer empilhar um nmero (30), como que a Pilha representada como um vetor, que esse vetor vet, que p.topo o topo da pilha, que p.topo inicialmente 1, etc. 3. Os mtodos usados para manipular os dados (crie, empilhe, desempilhe, vazia) conferem a utilizao adequada dos dados. Por exemplo, "p.push(30)"confere se ainda h espao na pilha, enquanto que em "p.vet[++p.topo] = 30" o usurio se esqueceu disto. Resumindo, mais seguro usar Proteo de Informao atravs dos mtodos get e set.

5.5

OBJETOS

Voltando ao passado, os programadores visavam programas como longas listas de instrues que realizam uma especca tarefa. Quando voc criar programas baseados em objetos, voc olhar para os objetos que fazem parte do seu programa. Por exemplo, assuma que voc est escrevendo um programa que implementa um simples processador de textos. Se voc pensar em todas as funes que um processador de textos realiza, pode rapidamente desanimar. De qualquer modo, se voc visualizar o processador de textos como uma coleo de distintos objetos, o projeto toma-se menos intimidante. Por exemplo, a Figura 5.14 ilustra os principais objetos do processador de textos. medida que voc comea a identicar os objetos utilizados em seu sistema, voc ir descobrir que muitas partes diferentes do seu programa usam os mesmos tipos de objetos. Como resultado, para escrever seus programas em termos de objetos, voc pode facilmente (e rapidamente) reutilizar o cdigo que escreveu para uma parte diferente do seu programa ou at mesmo em um diferente programa, como ilustrado na Figura 5.15 Aps voc identicar os objetos, deve determinar o propsito da cada objeto. Para isso, imagine as operaes que o objeto realiza ou as que so realizadas no objeto. Dado um arquivo objeto, um programa pode copiar, deletar, renomear o arquivo. Tais operaes

Programao Orientada a Objetos

43

Processador de Textos

Editor

Verificador Ortogrfico

Operaes Impressora

Operaes Arquivo

Dicionrio

Figura 5.14: Objetos em um Processador de Textos

Editor

Operaes Impressora

Documento

Tela

Comando

Documento

Impressora

Comando

Corretor Ortogrfico

Operaes Arquivo

Documento

Dicionrio

Comando

Documento

Arquivo

Comando

Documento

Palavra

Dicionrio

Comando

Figura 5.15: Reutilizao de Cdigo

iro se tornar as funes-membro do objeto. Na seqncia, identique a informao que voc deve conhecer a respeito do objeto. No caso do arquivo objeto, voc deve saber o nome do arquivo, o tamanho, atributo de proteo, data da ltima atualizao, por exemplo. Estes itens de dados iro tornar-se nas variveis-membro do arquivo objeto. A Figura 5.16 mostra como pode ser imaginado nosso arquivo objeto. Voc pode pensar que seu programa precisa visualizar e imprimir seus arquivos e que s vezes os arquivos contm programas executveis que voc precisa executar. Existir uma forte tendncia em querer adicionar mtodos (funes) para a denio do objeto arquivo acima. Entretanto, existem formas melhores para tratar tais casos. Uma soluo seria construir duas novas classes de objeto, as quais, poderemos chamar de documentos

44

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

Arquivo
Nome Tamanho Atributo Data Copiar Deletar Renomear

Nome do Objeto Variveismembro do objeto (dados)

Funesmembro do objeto (operaes)

Figura 5.16: Estrutura de um Objeto

e programas, e simplesmente adicionar os campos exigidos para cada classe, como mostra a Figura 5.17.

Documento
Nome Tamanho Atributo Data Formatar Copiar Deletar Renomear Visualizar Imprimir

Programa
Nome Tamanho Atributo Data S. Operacional Copiar Deletar Executar

Figura 5.17: Classes Documentos e Programas

Uma outra soluo, muito melhor, seria construir as duas classes de objetos baseadas na classe de arquivo, como ilustrado na Figura 5.18. Quando seus programas constroem uma classe a partir de outra, desta forma, a nova classe herda as funes-membro e variveis da classe bsica. No caso das classes documento e programa, os objetos que voc criar destes tipos de classe no somente podem usar suas prprias funes-membro e variveis, mas tambm as da classe arquivo. Assim, seu programa pode visualizar, imprimir, copiar, deletar, renomear um arquivo de documento.

Programao Orientada a Objetos

45

Arquivo
Nome Tamanho Atributo Data Copiar Deletar Renomear

Documento
Formatar Visualizar Imprimir

Programa
S. Operacional Executar

Figura 5.18: Usando Herana

5.6 5.6.1

DEFINIES DE PROGRAMAO ORIENTADA A OBJETOS Classes

A linguagem de programao C++ uma derivao da linguagem de programao C. Logo, o conjunto de instrues que faz parte da linguagem C tambm incorpora o C++. As principais implementaes adicionadas linguagem C para dar origem ao C++ consistem de classes, nos objetos e na idia de programao orientada ao objeto. Na discusso anterior, os termos objetos e classes foram usados livremente. Em geral, uma classe oferece uma mscara com a qual seu programa pode mais tarde criar objetos. Por exemplo, a classe arquivo previamente discutida, descreve as funes-membro e variveis que iro ser usadas pelos objetos-arquivo que seu programa criar no futuro. Um objeto por esse motivo uma instncia de uma mscara da classe. Em outras palavras, um objeto a entidade ou coisa com a qual seus programas trabalham. Uma denio de classe em C++ muito similar a uma denio de estrutura em C vista anteriormente. Por exemplo, as declaraes apresentadas na Figura 5.19 denem a classe arquivo. Uma classe considerada um tipo de dado como os tipos que existem predenidos em compiladores de diversas linguagens de programao. Como exemplo, considere um tipo int

46

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

class arquivo { public: char nome_arquivo[32]; long tamanho; private: unsigned protecao; long data;

// varivel membro pblica

// varivel membro privada

int copiar(char *nome_destino); int renomear(char *nome_destino); int deletar(void); };

// funo membro privada

Figura 5.19: Implementao da Classe Arquivo

que predenido em C e C++. Podemos declarar tantas variveis do tipo int quantas forem necessrias ao programa. De modo similar, pode-se declarar quantas variveis quisermos de uma classe j denida. Como visto, uma classe no cria um objeto. Para criar um objeto, voc simplesmente especica o tipo da classe, seguido pelo nome da varivel objeto, como mostrado na Figura 5.20.
main() { nome_da_classe nome_do_objeto; // cria um objeto nome_do_objeto do // tipo nome_da_classe : : int var; // definio de varivel simples do tipo int }

Figura 5.20: Usando Classes

Assim, varivel de uma classe chamada objeto e conter campos de dados e funes. Denir uma classe no cria nenhum objeto, do mesmo modo que a existncia do tipo int no cria nenhuma varivel. As funes de um objeto so chamadas funes-membro ou mtodos e, de modo geral, so o nico meio de acesso s variveis-membro (campos de dados) tambm chamados de variveis de instncia. As classes so muito mais poderosos que as estruturas e unies. Elas so formadas por variveis-membro e funes-membro que operam esses dados.

Programao Orientada a Objetos

47

5.7

ENCAPSULAMENTO

Se um programa precisa atribuir valor a alguma varivel de instncia, deve chamar uma funo-membro que recebe o valor como argumento e fazer a alterao. No se pode acessar variveis de instncia diretamente. Assim, os campos de dados cam escondidos para ns, o que previne alteraes acidentais. Diz-se ento, que os campos de dados e suas funes esto encapsulados, ou seja, tenham uma nica identidade. Esse processo de impedir a visibilidade dos dados para o mundo externo ao objeto chamado de encapsulao. Com a encapsulao de dados os detalhes de implementao cam escondidos dos demais objetos, com isso o programador preocupa-se apenas com o que um objeto faz, sem perder tempo entendendo como o objeto faz. Desta forma, conclui-se que a encapsulao aumenta a modularidade e simplica a escrita, manuteno e alterao dos programas.

5.8

MENSAGEM

Objetos s so teis quando associados com outros objetos para alcanar um resultado. E como os objetos interagem entre si? A resposta para essa pergunta , atravs de mensagens. Para melhor entendimento, pense num objeto carro com um mtodo para mudar sua velocidade. Em um programa para modelar o uso de um carro, poderamos criar um objeto do tipo motorista e us-lo associado ao objeto carro. Mas, como nosso motorista aumentaria a velocidade do carro? Com uma mensagem adequada para tal, uma mensagem "ACELERAR", por exemplo. Uma mensagem possui basicamente trs componentes: objeto para receber a mensagem (carro); um nome da operao (mtodo/funo-membro) a ser executada pelo objeto (acelerar); um parmetro (argumento) do qual a velocidade pode depender (velocidade). Um programa em C++ consiste em um conjunto de objetos que se comunicam por meio das chamadas s funes-membro e para chamar um mtodo de um objeto deve-se enviar uma mensagem ao objeto da funo-membro em questo.

5.9

HERANA

A programao orientada a objetos oferece uma maneira de relacionar classes uma com as outras por meio de hierarquias. Logo, pode-se dividir classes em sub-classes, mantendo-se o princpio de que cada sub-classe herda caractersticas da classe, da qual foi derivada. Partindo-se do reino animal, a classe de animais dividida nas sub-classes

48

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

mamferos, aves, peixes, etc. Uma das caractersticas dessa classe a reproduo. Toda sub-classe tem essa caracterstica. Em C++, a classe de origem chamada classe-base e as classes que compartilham as caractersticas de uma classe-base e tem outras caractersticas adicionais so chamadas classes derivadas. Uma classe-base representa os elementos comuns a um grupo de classes derivadas. Pode-se pensar em herana como algo semelhante ao uso de funes para simplicar tarefas tradicionais. Escreve-se uma funo quando identica vrias sees diferentes de um programa, em parte executam a mesma coisa. Em C++, dene-se uma classe-base quando identica-se caractersticas comuns em um grupo de classes derivadas. Da mesma forma voc pode criar uma biblioteca de funes teis a diversos programas, pode formar uma biblioteca de classes que podero vir a ser o ncleo de muitos programas. O uso de biblioteca de classes oferece uma grande vantagem sobre o uso de uma biblioteca. Isto signica que, sem alterar a classe-base, possvel adicionar a ela caractersticas diferentes que a tornaro capaz de executar exatamente o que desejamos. Uma classe que derivada de uma classe-base pode, por sua vez, ser classe-base de outra classe. O uso de classes derivadas aumenta a ecincia da programao pela no necessidade da criao de cdigos repetitivos. A uma funo de biblioteca no se pode adicionar outras implementaes a no ser que ela seja reescrita ou que tenhamos seu cdigo-fonte para alter-la e recompil-la. A facilidade com que classes existentes podem ser reutilizadas sem serem alteradas uma dos maiores benefcios oferecidos por linguagens orientadas ao objeto. A herana o processo pelo qual criamos novas classes, chamadas classes derivadas.

5.10

POLIMORFISMO

O sentido da palavra polimorsmo provm do uso de um nico nome para denir vrias formas distintas. Em C++ d-se o nome de polimorsmo criao de uma famlia de funes virtuais. Uma funo virtual uma funo membro de classe que projetada para trabalhar com virtualmente quaisquer membros de classe-bsica ou derivada (de tipo ainda desconhecido). Voc pode pensar numa funo virtual como alguma coisa como uma funo varivel, uma funo-membro derivada e ainda desconhecida. Retornaremos com esse assunto nos prximos captulos, quando tivermos que colocar a mo na massa. Por hora devemos nos lembrar apenas que, essa capacidade da linguagem C++ possibilitar vrias formas a um dado objeto torna o C++ uma ferramenta muito poderosa e exvel para o desenvolvimento das aplicaes.

Programao Orientada a Objetos

49

5.11

DECLARAO DOS ATRIBUTOS

Os atributos so as variveis da classe importantes para resolver um determinado problema. Por exemplo, os atributos de uma classe Pedido consiste dos campos do formulrio de um pedido, como, nmero do pedido, data, nome do cliente, endereo, produtos, quantidades, preos etc. Caso o problema necessite de uma classe denominada Pssaro, ento deve-se determinar quais variveis de um pssaro so importantes para resolver o problema. Se voc quer saber qual pssaro voa mais alto e mais rpido, guardar a cor do pssaro de nada adiantar. Neste caso voc deve guarar a velocidade mxima e altura mxima de vo do pssaro. Os tipos dos atributos so os tipos j conhecidos da linguagem C, entre eles, int, float, double, char etc. Veja o exemplo abaixo:
class ponto { // Declarao dos atributos int x, y; char cor; };

No exemplo acima declarou-se uma classe ponto que possui o X, o Y e a Cor como atributos da classe Ponto. Na programao orientada a objetos aparecem 3 modicadores, public,private, protected. Estes modicadores alteram a visibilidade dos atributos da classe, veja tabela abaixo. Quando um atributo declarado como pblico qualquer objeto pode acessar este atributo. Quando ele declarado privado, apenas os objetos da mesma classe podem acessalo. Quando declarado como protected apenas os objetos da prpria classe e das classes derivadas podem acessar este atributo. Veja abaixo o exemplo da declarao dos mtodos usando modicadores.
class ponto { // Declarao dos atributos public: int x; private: int y; protected: char cor; };

50

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

5.12

CONSTRUTORES E DESTRUTORES DE CLASSE

Ao criar um objeto, existem situaes em que voc precisa alocar memria para buffers usados pelo objeto. Por exemplo, assuma que voc esta trabalhando com um arquivo objeto e necessita que armazene o nome do arquivo como uma cadeia da caracteres. Ao criar o objeto, voc quer que ele aloque memria dinamicamente para a cadeia, e quando ele no for mais necessrio voc desejar liberar a memria. Para auxiliar seus programas a realizar operaes cada vez que um objeto criado (construtor) e cada vez que ele for destrudo (destrutor), C++ suporta funes de construo e de destruio. Ou seja, construtor nada mais do que uma funo-membro que automaticamente executada cada vez que voc cria um objeto e destrutor uma funo-membro que automaticamente executada quando um objeto destrudo. Assim uma funo construtor uma funo-membro que C++ automaticamente executa cada vez que voc criar um objeto de uma classe especca. A funo construtor a nica que usa o mesmo nome da classe. Como tal, para uma classe de nome aluno, a funo construtor seria denida aluno. Alm disso, a funo no retorna um valor e no do tipo void, como ilustrado na Figura 5.21.
class Triangulo { private: double fb, fh; public: // funo construtora Triangulo(double base, double altura); // funo destrutora ~Triangulo(); double area(double b, double h); };

Figura 5.21: Classe Triangulo

O destrutor uma funo executada automaticamente quando um objeto destrudo. Como a funo construtor, a funo destrutor tem o mesmo nome que a classe. Tambm, a funo destrutor no retorna um valor e no do tipo void. Seus programas no podem passar parmetros para uma funo destrutor. Distingue-se uma funo destrutora de uma funo normal devido ao fato que o destrutor precedido por um caractere til (~), mostrado na Figura 5.21. Quando voc dene funes construtoras nos seus programas, pode especicar mltiplas funes das quais o compilador ir selecionar funo correta a invocar baseado no que seu programa usa. Por exemplo, o programa apresentado na Figura 5.22 usa as funes

Programao Orientada a Objetos

51

construtoras para a classe mensagem. O primeiro construtor atribui a mensagem especicada atravs do parmetro mensagem, enquanto o segundo parmetro utiliza a mensagem default Os Sertes.
#include <iostream.h> #include <string.h> class mensagem { public: mensagem(char *titulo); mensagem(); void mostra_texto(); private: char texto[64]; }; mensagem::mensagem(char *titulo) { strcpy(texto, titulo); } mensagem::mensagem(void) { strcpy(texto, "Os Sertoes"); } void mensagem::mostra_texto(void) { cout << "Obra: " << texto << endl; } void main(void) { mensagem livro1; mensagem livro2("Introducao ao C++"); livro1.mostra_texto(); livro2.mostra_texto(); }

Figura 5.22: Classe Mensagem

A criao do primeiro objeto livro1 no especica parmetros. Portanto, o programa chama o construtor que funciona como void sem parmetros). Ao criar o objeto livro2, o programa passa uma cadeia de caracteres para o construtor. Por essa razo, o programa chama o construtor que suporta um parmetro string (cadeia de caracteres). Uma maneira de se obter o mesmo resultado seria trabalhar com argumentos default em construtores. Nesse caso voc pode especicar valores para cada parmetro do construtor. Assim a mesma rotina poderia ser reescrita como ilustrado na Figura 5.23. Considerando a classe Pilha apresentada na Seo 5.4 observa-se que ela possui um mtodo crie para criar (inicializar) a pilha. Este mtodo facilmente esquecido de ser chamado, como mostrado na Figura 5.24.

52

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

#include <iostream.h> #include <string.h> class mensagem { public: mensagem(char *titulo="O Alquimista"); void mostra_texto(); private: char texto[64]; }; mensagem::mensagem(char *titulo) { strcpy(texto, titulo); } void mensagem::mostra_texto(void) { cout << "Obra: " << texto << endl; } void main(void) { mensagem livro1; mensagem livro2("Introducao ao C++"); livro1.mostra_texto(); livro2.mostra_texto(); }

Figura 5.23: Usando Construtores Default

void main() { Pilha p; p.empilhe(10); // ... }

Figura 5.24: Uso da Classe Pilha

No exempo acima, empilhe iria usar uma varivel p.topo que no foi inicializada, pois p.crie no foi chamado. Para contornar este problema, C++ permite declarar um tipo especial de mtodo chamado construtor da classe. Este mtodo possui sempre o mesmo nome que a classe e chamado automaticamente na declarao de uma varivel da classe. Ele no pode ser invocado pelo programador. Veja o exemplo apresentado na Figura 5.25. No cdigo apresentado na Figura 5.26, o contrutor chamado trs vezes, uma vez para cada varivel de A. Os campos "a.n", "b.n"e "c.n"so inicializadas como 0.

Programao Orientada a Objetos

53

class A { int n; public: A() { n = 0; } // construtor int get() { return n; } void put(int i) { n = i; } }; void main() { A b; // chama o contrutor A() para b, fazendo b.n = 0 cout << b.get() << endl; // imprime 0 }

Figura 5.25: Usando Construtores


void main() { A a, b, c; cout << a.get() << endl; // imprime 0 cout << b.get() << endl; // imprime 0 cout << c.get() << endl; // imprime 0 }

Figura 5.26: Declarando Objetos

O construtor, como qualquer outro mtodo, pode ter parmetros, como mostra a Figura 5.27.
class A { int n; public: A(int i) { n = i; } int get() { return n; } void put(int i) { x = i; } };

Figura 5.27: Construtores com Parmetros

Como o construtor no chamado explicitamente, os parmetros para ele so passados nas declarao das variveis. Isso mostrado na Figura 5.28.

54

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

void main() { // chama o contrutor A(int i) para a, // inicializando a.n com 5. A a(5); // inicializa b.n com 10; A b(10); cout << a.get() << endl; // imprime 5 cout << b.get() << endl; // imprime 10 }

Figura 5.28: Criando Variveis com Parmetros

Na Pilha, interessante usar o construtor para substituir crie(), como mostra a Figura 5.29.
class Pilha { // ... public: Pilha() { topo = 1; } boolean empilhe(int elem) { // ... } // fim empilhe // ... }; void main() { // chama o construtor para p : inicializa p.topo com Pilha p; p.empilhe(10); // chama o construtor para q : inicializa q.topo com Pilha q; // ... }

Figura 5.29: Construtor da Classe Pilha

Assim como existe o construtor para inicializar os dados do objeto, alocar memria, abrir arquivo, etc, existe o destrutor para realizar as operaes inversas como desalocar memria, fechar arquivos, etc. O nome do destrutor de uma classe Pilha ~Pilha(). O destrutor ser chamado sempre que o objeto for destrudo. Como exemplo, a Figura 5.30 mostra o refazimento de parte da classe Pilha.

Programao Orientada a Objetos

55

class Pilha { private: Elem *topo; public: Pilha() { topo = NULL; } ~Pilha() { Elem *w; w = topo; // desaloca os elementos while ( topo != NULL ) { w = topo->suc; delete topo; topo = w; } // ... };

Figura 5.30: Redenio da Classe Pilha

O cdigo apresentado na Figura 5.31, por sua vez, mostra quando o destrutor chamado: no m do escopo da varivel da classe Pilha.

// ... void main() { Pilha p; // chama construtor Pilha para p // ... if ( i -> 0 ) { Pilha w; // chama construtor Pilha para w // ... } // fim do if: chama ~Pilha para w // ... } // fim de main: chama ~Pilha para p

Figura 5.31: Chamada de Destrutores na Classe Pilha

Os construtores e destrutores so tambm chamados quando objetos so alocados e desalocados com new e delete, como mostra a Figura 5.32. Utilizemos a classe Tempo, apresentada na Figura 5.33 nos pargrafos a seguir. Nesta classe, a especicao dos mtodos feita antes da declarao das variveis de instncia.

56

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

// ... void main() { Pilha *p; p = new Pilha; // chama construtor Pilha() // ... delete p; // chama ~Pilha() }

Figura 5.32: Criando objeto dinamicamente

Isto no causa erro de compilao. Um objeto de Tempo pode ser criado de duas formas, como mostra a Figura 5.34
class Tempo { public: Tempo( int p_hora, int p_min, int p_seg ) { // admite que os parametros estao corretos hora = p_hora; min = p_min; seg = p_seg; } Tempo() { hora = min = seg = 0; } void incSeg() { seg++; // incrementa um segundo if ( seg == NUM_SEG_MIN ) { seg = 0; min++; if ( min == NUM_MIN_HORA ) { min = 0; hora++; if ( hora == NUM_HORA_DIA ) hora = 0; } } } void imprime() { cout << hora << ":" << min << ":" << seg; } private: int hora, min, seg; };

Figura 5.33: Classe Tempo

Programao Orientada a Objetos

57

Tempo t1(23, 50, 10); // 1 Tempo t2; // 2

Figura 5.34: Criando Objetos da Classe Tempo

Assim, com referencia ao cdigo da Figura 5.34, em 1, o construtor Tempo(int, int, int) ser chamado. Em 2, ser invocado Tempo(). No h nenhuma ambigidade entre os dois construtores porque eles possuem nmero de parmetros diferentes. Como j vimos, duas funes podem ter o mesmo nome desde que tenham nmero e/ou tipo dos parmetros diferentes. Isto vlido tambm para mtodos e construtores. Pode-se especicar apenas o prottipo dos mtodos na classe deixando a sua denio para depois. Assim, poderamos ter feito a implementao da classe Tempo como apresentado na Figura 5.35.

class Tempo { public: Tempo( int p_hora, int p_min, int p_seg ); Tempo(); void incSeg(); void imprime(); private: int hora, min, seg; }; Tempo::Tempo( int p_hora, int p_min, int p_seg ) { hora = p_hora; min = p_min; seg = p_seg; } Tempo::Tempo() { hora = min = seg = 0; } void Tempo::incSeg() { // ... } void Tempo::imprime() { // ... }

Figura 5.35: Classe Tempo

58

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

Usualmente colocamos a declarao da classe em um arquivo header (".h" ou ".hpp") e a implementao dos mtodos em um arquivo ".cpp" ou ".cc". Para utilizar a classe, basta incluir o arquivo ".h"e fazer a ligao com o arquivo objeto (".obj" ou ".o") onde esto compilados os mtodos da classe. Estude o exemplo abaixo. Arquivo tempo.h:
class Tempo { public: Tempo( int p_hora, int p_min, int p_seg ); Tempo(); void incSeg(); void imprime(); private: int hora, min, seg; };

Arquivo tempo.cpp:
#include <iostream.h> #include <tempo.h> Tempo::Tempo( int p_hora, int p_min, int p_seg ) { // ... } Tempo::Tempo() { hora = min = seg = 0; } void Tempo::incSeg() { // ... } void Tempo::imprime() { // ... }

Este arquivo (tempo.cpp) deve ser compilado para "tempo.o". Para utilizar a classe Tempo, como no arquivo "uso.cpp" abaixo, deve-se construir um projeto e inserir "tempo.o" neste projeto.

Programao Orientada a Objetos

59

// arquivo uso.cpp #include <iostream.h> #include <tempo.h> void main() { Tempo t(3, 6, 25); t.imprime(); // ... }

Observe que para utilizar a classe Tempo no necessrio conhecer a sua parte privada. Este o motivo pelo qual colocamos a parte publica antes da privada - isto aumenta a legibilidade da classe j que a parte realmente til aparece em primeiro lugar. Duas classes diferentes podem ter mtodos ou variveis de instncia com o mesmo nome sem provocar ambigidades. Quando declaramos e usamos
Tempo t; t.incSeg();

sabemos que o mtodo incSeg chamado ser o da classe Tempo, j que t uma varivel desta classe. Classes podem ser tipos de variveis de instncia. A classe Aula, apresentada na Figura 5.36 utiliza a classe Tempo como o tipo de "t". Isto signica que um objeto de Aula contm um objeto de Tempo.
class Aula { public: Aula( char *p_nomeProf, int hora, int min, int seg ); // ... private: char nomeProf[ MAX_CH_PROF + 1 ]; Tempo t; };

Figura 5.36: Classe Aula

Quando o construtor de Aula for chamado, ele dever chamar o construtor de Tempo para construir a varivel t. Isto feito utilizando-se a seguinte sintaxe apresentada na Figura 5.37

60

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

Aula::Aula( char *nome, int hora, int min, int seg ) : t(hora, min, seg ) { strcpy( nomeProf, nome ); }

Figura 5.37: Construtor da Classe Aula

Observe que o construtor para t chamado antes do corpo do construtor de Aula. O mtodo imprime de Tempo
void Tempo::imprime() { cout << hora << ":" << min << ":" << seg; }

Como j estudamos, as referncias s variveis hora, min e seg dentro de imprime referem-se a "t.hora", "t.min" e "t.seg" quando este mtodo for invocado atravs de "t.imprime()". Tudo se passa como se imprime fosse uma funo
void imprime( Tempo *this )

e a chamada do mtodo
imprime(&t);

faz o parmetro this referir-se ao objeto que recebeu a mensagem, no caso, t. O mtodo imprime poderia ser reescrito como
void Tempo::imprime() { cout << this->hora << ":" << this->min << ":" << this->seg; }

Considere agora o exemplo da classe Nome, apresentada na Figura 5.38 onde o parmetro p passado em 4 funo m. Nesta passagem de parmetros, um construtor Nome(const Nome &), criado automaticamente pelo compilador, chamado para copiar p em w, parmetro de m. O resultado como se w tivesse sido criado pela declarao Nome w(p);

Programao Orientada a Objetos

61

#include <iostream.h-> class Nome { public: Nome( char *p_s ) { s = new char[ strlen(p_s) + 1 ]; strcpy( s, p_s ); } ~Nome() { delete s; } char *get() { return s; } private: char *s; }; void m( Nome w ) // 1 { cout << w.get() << \n; } // 2 void main() { Nome p("Joao"); // 3 m(p); // 4 cout << p.get(); // 5 } // 6

Figura 5.38: Classe Nome

Esta cpia faz as variveis de instncia p.s e w.s apontarem para uma mesma string "Joao". 1 Ao m da funo m, em 2, o destrutor Nome chamado sobre w, causando a liberao da memria da string apontada por "w.s". Agora, "p.s" aponta para uma rea que j foi liberada. Retornando o controle funo main, a instruo em 5 manipular a string apontada por p.s, causando possivelmente um erro, que ser a impresso de caracteres diferentes dos da string "Joao". Em 6, o destrutor de Nome chamado para p, liberando a memria apontada por p.s, que j foi liberada. Isto causar um erro de alocao de memria que pode terminar o programa. Por causa de problemas como estes, use objetos alocados dinamicamente sempre que possvel, embora este problema possa ser tambm corrigido fazendo-se um construtor
Nome::Nome( const Nome &t ) { s = new char[strlen(t.s) + 1]; strcpy( s, t.s ); }

62

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

que aloca memria para uma nova string ao invs de fazer


this->s = t.s;

com o construtor equivalente feito pelo compilador.

5.13

INICIALIZANDO VARIVEIS EM CONSTRUTORES

As funes construtor existem para auxiliar na inicializao dos membros da classe quando a classe criada. Da forma como foi denido, C++ permite que se inicialize variveis-membro, colocando o nome da varivel e o valor desejado aps um sinal de dois pontos simples, antes da declarao da funo. O programa apresentado na Figura 5.39 usa este formato de inicializao do construtor para inicializar trs variveis-membro com os valores 5, 6 e 7.
#include <iostream.h> class objeto { public: objeto(void); void mostra_objeto(void); private: int n1; int n2; int n3; double n4; }; objeto::objeto(void) : n1(5), n2(6), n3(7) { n4 = 125.35; } void objeto::mostra_objeto(void) { cout << "n1: " << n1 << endl; cout << "n2: " << n2 << endl; cout << "n3: " << n3 << endl; cout << "n4: " << n4 << endl; } void main(void) { objeto numero; numero.mostra_objeto(); }

Figura 5.39: Inicializando Variveis-Membro

Programao Orientada a Objetos

63

5.14

ACESSO A VARIVEIS NAS CLASSES

Quando voc declara uma classe, pode denir membros como public, private ou protected. Membros pblicos da classe esto disponveis atravs de seu programa utilizando o nome do objeto com os operadores ponto ( objeto.membro ) ou indireo (objeto.membro). Membros privados da classe, por outro lado, somente podem ser acessados utilizando funes-membro da classe. Ao utilizar membros privados da classe, seus programas podem melhor controlar os valores atribudos aos membros da classe e a forma como esses valores so utilizados. Por default, todos os membros da classe so privados. Assim, colocando o rtulo private na declarao da classe, como j experimentado em exemplos anteriores, as variveis sero restritas ao uso somente pela classe a que elas pertencem, como mostrado na Figura 5.40.

class qualquer_classe { public: void qualquer_funcao(char *parametro); void qualquer_outra(int a, int b, int c); // mtodos pblicos private: int valor; char senha[32]; // variveis privadas };

Figura 5.40: Acesso a Variveis

5.15

OBJETOS E FUNES

Voc pode passar um objeto para uma funo por valor ou por referncia (caso seja necessrio mudar o valor de um membro). Da mesma forma, funes podem retornar objetos. O programa apresentado na Figura 5.41 passa um objeto mensagem para duas diferentes funes. A primeira funo utiliza chamada por valor para exibir as variveis-membro do objeto. A segunda funo utiliza por referncia para alterar as variveis-membro.

64

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

#include <iostream.h> #include <string.h> class Mensagem { public: Mensagem(char *mensagem, char *autor); ~Mensagem(); void Mostra_mensagem(void); char mensagem_tit[64]; private: char mensagem_autor[64]; }; Mensagem::Mensagem(char *mensagem, char *autor) { strcpy(mensagem_tit, mensagem); strcpy(mensagem_autor, autor); } Mensagem::~Mensagem() { } void Mensagem::Mostra_mensagem(void) { cout << "Usuario: " << mensagem_autor << endl; cout << "Mensagem: " << mensagem_tit << endl; } void Apoio_usuario(Mensagem observe) { observe.Mostra_mensagem(); } void Resposta_curso(Mensagem *observe) { strcpy(observe->mensagem_tit, "Curso Lotado!"); observe->Mostra_mensagem(); } void main(void) { Mensagem usuario("Inscricao curso C++", "Marcos"); Apoio_usuario(usuario); Resposta_curso(&usuario); }

Figura 5.41: Chamadas de Funes

5.16

EXERCCIOS

1. Construa uma classe para os nmeros complexos denominada Complexo (a + bi, onde a e b so nmeros reais e i a unidade imaginria). Voc deve implementar os construtores que: a) aceitem nada como parmetro e neste caso os valores de a e b devem ser lidos; b) aceitem a e b como parmetros; c) aceitem somente a

Programao Orientada a Objetos

65

como parmetro e neste caso b deve ser zero; d) aceitem b como parmetro e a deve ser zero. As operaes possveis para os nmeros complexos so asoma e a subtrao. (Nota: Dados Z1= a + bi e Z2=c + di tm-se que Z1 + Z2 = (a + c) + (b + d)i e Z1 - Z2 = (a - c) + (b - d)i. 2. Escreva uma classe para conter trs membros do tipo int chamados hora, mins e segs e chame-a de tempo. a) Crie um construtor que inicialize os dados com zero e outro contrutor que inicialize os dados com um valor xo. b) Crie uma funo-membro para solicitar a hora, os minutos e os segundos para o usurio. c) Crie uma funo-membro para imprimir a hora no formato hh:mm:ss. d) Crie uma funo-membro para adicionar dois objetos da classe tempo passados como argumentos. e) Crie uma funo membro para subraia duas horas e retorne o nmero de segundos entre elas. A funo membro recebe dois objetos da classe tempo passados como argumentos. 3. Escreva um aclasse para armazenar dados de um estacionamento. Ela deve ser capaz de armazenar o nmero da chapa do carro, a marca, a hora de entrada e a hora de sada do estacionamento. Utilize dois membros da classe tempo, denida no exerccio anterior, para as horas de entrada e sada. a) Crie uma funo-membro para solicitar os dados de um carro para o usurio (utilize as funes da classe tempo para pedir a hora de entrada e sada). b) Crie uma funo-membro para imprimir os dados de um carro. c) Admita que o estacionamento cobre R$ 4.00 a hora. Escreva uma funo-membro que imprima o valor cobrado. Utilize a funo que subtrai duas horas da classe tempo. d) Escreva um programa que crie uma matriz e cinco objetos da classe anterior, solicite os dados dos carros para o usurio e imprima um relatrio dos dados e do valor cobrado.

5.17

ARRAYS DE CLASSES

Como existem casos em que sua classe pode conter um array de valores, existem outras situaes em que seu programa usa um array para pegar mltiplos objetos. Por

66

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

exemplo, o programa apresentado na Figura 5.42, usa um array para pegar cinco objetos data.

#include <iostream.h> #include <string.h> class Data { public: Data(int mes, int dia, int ano); Data(void); ~Data(void); void Mostra_data(void); private: int mes; int dia; int ano; }; Data::Data(int mes, int dia, int ano) { Data::mes = mes; Data::dia = dia; Data::ano = ano; cout << "Construtor de data: "; Mostra_data(); } Data::Data(void) { cout << "Construtor de data sem data " << endl; } Data::~Data(void) { cout << "Destrutor de data: "; Mostra_data(); } void Data::Mostra_data(void) { cout << mes << / << dia << / << ano << endl; } void main(void) { Data feriados[3]; Data ano_novo(01, 01, 97); Data carnaval(02, 15, 97); Data natal(12, 25, 97); feriados[0] = ano_novo; feriados[1] = carnaval; feriados[2] = natal; }

Figura 5.42: Array de Objetos

Programao Orientada a Objetos

67

Quando voc usa um array de objetos, precisa car claro que C++ chama as funes construtor e destrutor para cada elemento do array. No caso da Figura 5.42, as funes construtor e destrutor s exibem uma mensagem, deixando voc perceber que elas foram chamadas.

5.18

EXERCCIOS

1. Construa uma classe denominada cliente (nome, endereo, salrio, idade) e dentro desta classe construa os mtodos para ler estes valores, imprimi-los na tela. Construa ainda funes para imprimir qual o cliente mais novo, mais velho, o que ganha mais e o que ganha menos. Na funo principal do programa crie um array de 10 clientes e faa o teste das funes.

5.19

HERANA DE CDIGOS EM C++

Conforme dene-se classes nos seus programas, voc talvez ache que classes geralmente possuem caractersticas similares. Levando vantagem de tais relacionamentos de objeto, voc pode signicativamente reduzir a quantidade de cdigo de programa, no s reduz seu tempo de programao, mas tambm melhora a legibilidade, pois menos cdigo resulta em menor possibilidade de se cometer erros.

5.20

CLASSES DERIVADAS

Ao construir classes baseadas nos relacionamentos entre objetos, seus programas levam vantagem a herana uma classe derivada pode herdar caractersticas de sua classe bsica. O exemplo apresentado na Figura 5.43 utiliza-se da herana para adicionar as coordenadas x e y a uma classe que derivada da classe que contm as variveismembro x e y. Ao criar uma classe derivada, voc especica o nome da classe derivada, seguido de dois pontos e o nome da classe bsica, como mostrado aqui:
class derivada : public base{ variveis e funes membros; }

68

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

#include <iostream.h> class Ponto2D { public: Ponto2D(double x, double y); ~Ponto2D(); protected: double fx; double fy; }; class Ponto3D: public Ponto2D { public: Ponto3D(double x, double y, double z); ~Ponto3D(); double coord_x() { return fx; } double coord_y() { return fy; } double coord_z() { return fz; } private: double fz; }; Ponto2D::Ponto2D(double x, double y) { fx = x; fy = y; } Ponto2D::~Ponto2D() { } Ponto3D::Ponto3D(double x, double y, double z) : Ponto2D(x, y) { fz = z; } Ponto3D::~Ponto3D() { } int main(void) { double x,y,z; cout << "Coordenadas: " << "\n" << "x = "; cin >> x; cout << "y = "; cin >> y; cout << "z = "; cin >> z; Ponto3D *c = new Ponto3D(x,y,z); cout << "(" << c->coord_x() << "," << c->coord_y() << ","; cout << c->coord_z() << ")" << endl; return 0; }

Figura 5.43: Usando Herana

Programao Orientada a Objetos

69

Quando voc usa a palavra-chave public desta forma, os membros pblicos da classe bsica so consideradas pblicos na classe derivada. Igualmente, membros protected da classe bsica so tratados como membros protected na classe derivada. Se suas denies de classe usarem a palavra chave private, por sua vez, os membros public e protected da classe bsica sero tratados como membros private da classe derivada. Quando voc dene classes em seus programas, existem situaes em que duas ou mais classes compartilham caractersticas (membros) similares. Antes de duplicar os membros de cada classe, dena uma classe bsica que contm as funes-membro comuns. Em seguida voc pode derivar classes a partir da classe bsica. Quando voc dene classes dessa forma, a classe derivada herda as caractersticas da classe bsica. Suponha que voc tenha criado uma classe veculo:
class veculo { public: veiculo(char *nome, int rodas, int potencia, int velocidade); void mostra_veiculo(void); private: char nome[64]; int potencial; int velocidade; };

Com o auxlio da herana, pode-se declarar uma classe automvel, como segue:
class automovel: public veiculo { public: automovel(char *name, int potencia, int velocidade, int portas); void mostra_auto(void); private: int portas; };

De forma similar, pode-se declarar uma classe motocicleta, como segue:


class motociclo : public veiculo { public: motociclo(char *name, int potencia, int velocidade, int portas); void mostra_ciclo(void); private: int assentos; };

70

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

5.21

HERANA MLTIPLA

Herana mltipla o uso de duas ou mais classes bsicas para derivar uma nova classe. Quando voc deriva uma classe utilizando duas ou mais classes bsicas, especica o nome da classe derivada, seguido pelas classes bsicas, como mostrado abaixo:
class derivada : public basica1, public basica2 { variveis e funes membros; }

Por exemplo, suponha que voc tenha declarado as seguintes classes livro e disco:
class livro { public: livro(char *titulo, char *autor, int edicao); void mostra_livro(void); private: char titulo[64]; char autor [64]; int edicao; }; class disco { public: disco(double espaco); void mostra_disco(void); private: double espaco; };

A seguir; criar-se uma classe de nome pacote que a combinao de livro e disco:
class pacote : public livro, public disco { public: pacote(char *tit, char *autor, int edicao, double cap,double preco); void mostra_pacote(void); private: double preco; };

Assim, pacote a classe derivada, e livro e disco so as classes bsicas. Observe o uso da palavra-chave public que antecede cada classe bsica. public permite que

Programao Orientada a Objetos

71

as classes derivadas tratem os membros public e protected da classe bsica como membros public ou protected da classe derivada.
derivada::derivada( int a, int b):basica1(a):basica2(b){ declaraes; };

Nesse caso, quando seu programa chamar o construtor da classe derivada, C++ ir chamar primeiro o construtor da classe basica1, seguido pelo construtor da classe basica2.

5.22

HERANA DE MLTIPLOS NVEIS

Como visto, herana mltipla o uso de duas ou mais classes bsicas derivadas em uma nova classe. Herana de mltiplos nveis, por outro lado, ocorre quando voc deriva uma classe de uma classe bsica que na realidade uma classe derivada de uma outra. A seguir mostra-se um exemplo de herana por mltiplos nveis. A classe pesquisador baseado na classe professor, que por sua vez, baseado na classe servidor. Inicialmente, para criar estas classes deve-se fazer uma anlise de quais dados elas possuem em comum. A seguir colocar estes dados comuns nas classes bsicas e com o aumento da necessidade ir expandindo o cdigo. Voc pode comear com a classe servidor, a seguir dene-se a classe professor derivada de servidor e nalmente derivase a classe pesquisador da classe professor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class servidor { public: servidor(char *nome, int idade) ; void mostra_servidor(void) ; private: char nome[64] ; int idade; }; class professor : public servidor { public: professor(char *nome, int idade, double salario) ; void mostra_professor(void) ; private: double salario; }; class pesquisador : public professor {

72 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

public: pesquisador(char *nome, int idade, double salario, char *pesquisa) ; void mostra_pesquisador(void) ; private: char pesquisa[64]; }; servidor::servidor(char *nome, int idade) { strcpy(servidor::nome, nome) ; servidor::idade = idade; } void servidor: :mostra_servidor(void) { cout << "Nome: " << nome << endl; cout << "Idade: " << idade << endl; } professor::professor(char *nome, int idade, double salario) : servidor(nome, idade) { professor::salario = salario; } void professor::mostra_professor(void) { mostra_servidor(); cout << "Salrio: " << salario << endl; } pesquisador::pesquisador(char *nome, int idade, double salario, char *pesquisa) : professor(nome, idade, salario) { strcpy(pesquisador::pesquisa, pesquisa); } void pesquisador::mostra_pesquisador(void) { mostra_professor(); cout << "Linha de Pesquisa: " << pesquisa << endl; } void main(void) { professor quimica("Fulano", 56, 3000.00); pesquisador mecanica("Beltrano", 34, 2400.00, "elementos finitos"); qumica.mostra_professor(); pesquisador.mostra_pesquisador(); }

Programao Orientada a Objetos

73

Como voc deve ter percebido no exemplo anterior, quando seus programas usam herana, voc permanece utilizando construtor para inicializar as classes. A nica diferena, entretanto, que o construtor da classe derivada deve chamar o construtor da classe bsica primeiro, como ilustra as linhas de cdigo 36/37 e 46/47. A funo construtora da classe derivada usa uma sintaxe similar para a denio de classe, com um dois pontos seguido pela funo construtora da classe bsica. Desta forma, os membros da classe bsica so corretamente inicializados e a memria para os buffers da classe bsica corretamente alocada antes que a classe derivada os referencie. Ainda nestas mesmas linhas, como se pode ver, a chamada ao construtor da classe bsica usa os nomes de parmetros idnticos aos que foram passados para o construtor da classe derivada. Quando voc deriva uma classe de uma outra, a classe derivada no pode acessar membros private da classe bsica. Dependendo de seus programas, existem situaes em que voc quer dar acesso especial aos membros das classes bsicas s classes derivadas. Em tais casos, voc pode usar membros protected da classe, os quais so acessveis pelas classes derivadas mas no pelo resto do programa. Por exemplo, dada a seguinte denio de classe, classes derivadas podem acessar os variveis-membros nome e prossao, mas no o membro private salrio:
class base { public: base(char nome[64], char profissao[64]); void mostra_base(void) ; protected: char nome[64]; char profissao[64]; private: double salario; };

5.23

COMPREENDENDO HERANA PELA RELAO UM E PARTE DE

Ao projetar suas classes, atributos e mtodos, voc deve considerar o tipo de herana necessrio. Por exemplo, voc pode ter as classes pingim, canrio, galo e faiso que herdam da classe Pssaro. Pode-se perceber que as classes derivadas atende a relao um, ou seja, pingim um Pssaro, canrio um Pssaro, galo um Pssaro e faiso um Pssaro. Quando esta relao satisfeita a herana deve ser realizada na linha de declarao da classe utilizando o operador ":". Esta relao satisfeita se a pergunta a classe derivada um classe pai (super classe)? for verdadeira. Portanto, como as perguntas: pingim

74

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

um Pssaro?; canrio um Pssaro?; galo um Pssaro?; faiso um Pssaro? so verdadeiras ento utiliza-se a declarao abaixo.

class class class class

pinguim : passaro { // corpo da classe programa}; canario : passaro { // corpo da classe programa}; galo : passaro { // corpo da classe programa}; faisao : passaro { // corpo da classe programa};

A outra relao de herana vericada perguntando se a classe devirada parte de classe pai. Por exemplo, motor parte de carro, roda parte de carro, velocmetro parte de carro, cmbio parte de carro etc. Quando a relao parte de se satisfaz, ento a herana denominada herana por composio, e neste caso a declarao diferente da vista acima. Deve-se perceber que o carro composto por estas partes, logo, os atributos do carro deve possuir estas partes, e no a classe carro herdar motor, cambio, roda, velocmetro etc. Veja exemplo abaixo.

class carro{ // declarao das classes que compe esta classe motor m; roda r[5]; velocimetro v; cambio c; // declarao dos atributos especficos do carro int cor; float preo; };

Deve-se observar que a classe Carro no herda diretamente as classes que a compe, porm, ela possui atributos que so do tipo destas classes. Ou seja, ela possui Motor, Roda, Velocmetro, Cambio etc. Basta agora usar estes objetos declarados dentro de Carro normalmente como aprendido at agora. Portanto, se em algum momento da classe carro, voc precisar saber a potncia do motor ento voc pode escrever m -> getPotencia(). perfeitamente possvel ignorar este detalhe e programar utilizando somente composio ou herana atravs do operador :, porm, para boa programao sempre identique a relao existente entre as classes e utilize a tcnica adequada para a relao identicada.

Programao Orientada a Objetos

75

5.24

FUNES VIRTUAIS

Como j mencionado anteriormente, polimorsmo em C++ baseado em funes virtuais. Em seu sentido mais simples, uma funo virtual uma funo-membro que as classes derivadas podem modicar, permitindo que sejam adaptadas s necessidades do programa. Muitas vezes essas funes no fazem absolutamente nada na classe bsica, esto ali somente para que possam ser referenciadas na classe bsica e implementada posteriormente pelas classes derivadas. Para declarar uma funo virtual , coloque antes da declarao, a palavra-chave virtual. Por exemplo, a seguinte classe servidor utiliza uma funo-membro virtual void mostra_servidor:
class servidor { public: servidor(char *nome, int idade); virtual void mostra_servidor(void); private: char nome[64]; int idade; };

Desta forma, seu programa pode derivar classes professor e pesquisador, cada uma das quais referenciando uma funo-membro mostra_servidor especca. Se voc no antecipar o nome de uma funo-membro da classe bsica com a palavrachave virtual, polimorsmo no ir ocorrer. Alm disso, se o tipo de retorno ou os tipos dos argumentos da funo-membro da classe derivada no so os mesmos, o polimorsmo tambm no ocorrer. O exemplo a seguir mostra o bom uso de uma funo virtual para realizar o polimorsmo.
#include <iostream.h> #include <stdlib.h> #define PI 3.141592 #define CICLO 1 class Elemento { public: virtual void Area() = 0; virtual void Dados() = 0; virtual void Print() = 0; }; class Retangulo : public Elemento { public: Retangulo(); ~Retangulo();

76

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

void Dados(); void Area(); void Print(); private: double fb; double fh; }; class Circulo : public Elemento { public: Circulo(); ~Circulo(); void Dados(); void Area(); void Print(); private: double fr; }; class Triangulo : public Elemento { public: Triangulo(); ~Triangulo(); void Dados(); void Area(); void Print(); private: double fb; double fh; }; Retangulo::Retangulo() { } Retangulo::~Retangulo() { } void Retangulo::Dados() { int b,h; cout << "Retangulo" << endl; cout << "b = "; cin >> b; cout << "h = "; cin >> h ; fb = b; fh = h; } void Retangulo::Area() { cout << "Area: " << fb*fh << endl;

Programao Orientada a Objetos

77

} void Retangulo::Print() { cout << "Dados do Retangulo:" << endl; cout << "b= " << fb << " h= " << fh << endl; cout << "Area: " << fb*fh << endl; } Circulo::Circulo() { } Circulo::~Circulo() { } void Circulo::Dados() { int r; cout << "Circulo" << endl; cout << "r = "; cin >> r; fr = r; } void Circulo::Area() { cout << "Area: " << PI*fr*fr << endl; } void Circulo::Print() { cout << "Dados do Circulo:" << endl; cout << "r= " << fr << endl; cout << "Area: " << PI*fr*fr << endl; } Triangulo::Triangulo() { } Triangulo::~Triangulo() { } void Triangulo::Dados() { int b,h; cout << "Triangulo" << endl; cout << "b = "; cin >> b; cout << "h = "; cin >> h; fb = b; fh = h; } void Triangulo::Area() { cout << "Area: " << fb*fh/2.0 << endl; } void Triangulo::Print() { cout << "Dados do Triangulo:" << endl; cout << "b= " << fb << " h= " << fh << endl;

78

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

cout << "Area: " << fb*fh/2.0 << endl; } main() { Elemento *forma[2]; char tipo = ; for(int i=0;i<3;i++) { cout<<"Digite uma letra R, C, T ou zero(0) para Sair"<<endl; cin >> tipo; switch(tipo) { case r: case R: forma[i] = new Retangulo; break; case c: case C: forma[i] = new Circulo; break; case t: case T: forma[i] = new Triangulo; break; case 0: exit(0); default: cout << endl; continue; } forma[i]->Dados(); forma[i]->Area(); } for(i=0;i<3;i++) { forma[i]->Print(); delete forma[i]; } }

No confunda polimorsmo com sobrecarga de funes. Uma vez que a denio da classe bsica no usa a palavra-chave virtual, as declaraes do membro na classe derivada simplesmente sobrecarregam a declarao da funo. As funes no so virtuais. Sobrecarga de funes o processo de denir duas ou mais funes, como mesmo nome, nos seus programas. As funes diferem somente pelo nmero ou tipo dos parmetros que elas suportam. Ao compilar seu programa, o compilador C++ determina qual funo invocar, baseado nos parmetros da funo. Assim, seus programas sempre chamam a funo correta automaticamente.

Programao Orientada a Objetos

79

5.25

FUNES AMIGAS

O conceito de isolamento dos itens de uma classe, onde funes no membro no teriam o privilgio de acesso aos dados privados ou protegidos desta classe, violado por um mecanismo oferecido pelo C++. Este mecanismo d permisso especial de acesso aos itens por essas funes no membros especiais. Declarando uma funo como friend (amiga), ela passa a ter os mesmos privilgios de uma funo-membro da classe, mas no est associada a um objeto da classe. O programa apresentado na Figura 5.44 seguir faz uso de funes friend.
#include <iostream.h> class tempo { private: long segundos; public: tempo(long h, long m, long s) { segundos = h*3600+m*60+s; } friend double prntm(tempo); // declaracao da funcao amiga }; double prntm(tempo); // declaracao da funcao void main() { tempo tm(5,8,20); cout << prntm(tm) << " % do dia" << endl; } double prntm(tempo tm) { double x; x = tm.segundos/86400.; x *=100; return x; }

Figura 5.44: Funes Amigas

Nesse programa, ao declararmos a funo prntm como friend da classe tempo, foi possvel ter acesso ao dado privado segundos da classe tempo.

5.26

CLASSES AMIGAS

Alm de ser possvel declarar funes independentes como friend, pode-se declarar uma classe toda como friend de outra. Neste caso, as funes-membro da classe sero todas friend da outra classe. A diferena que estas funes-membros possuem acesso parte privada ou protegida de sua prpria classe. O programa apresentado na Figura 5.45 usa esse conceito para disponibilizar os membros da classe friend. Observe que a declarao da classe friend pode ser em qualquer posio da classe.

80

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

#include <iostream.h> class tempo { private: long h, m, s; public: tempo(int hh, int mm, int ss) { h=hh; m=mm; s=ss; } friend class data; // data uma classe amiga }; class data { private: int d, m, a; public: data(int dd, int mm, int aa) { d=dd; m=mm; a=aa; } void prndt(tempo tm) { cout << "\nData: " << d << "/" << m << "/" << a; cout<<"\nHora: "<<tm.h<<":"<<tm.m<<":"<<tm.s<<endl; } }; void main() { tempo tm(07,18,30), tm1(23,18,30); data dt(02,07,97); dt.prndt(tm); dt.prndt(tm1); }

Figura 5.45: Classes Amigas

5.27

O PONTEIRO THIS

A palavra-chave this um ponteiro disponvel para todos os mtodos de uma classe. O ponteiro this enderea a instncia da classe que chamou a funo. A palavra-chave this indica um ponteiro auto-referido que declarado implicitamente pela linguagem. Por exemplo: TClasse *this; // onde TClasse o tipo da classe O ponteiro this aponta para o objeto para o qual a funo-membro invocada. No exemplo apresentado na Figura 5.46, o ponteiro this acessa a varivel de classe caractere. Nesse exemplo acima a funo Reset usa o ponteiro this para passar o objeto em questo como parmetro da funo Start.

Programao Orientada a Objetos

81

class Teste { char caracter; Teste(char ch) { caracter=ch; } char SetChar(char a) { caracter = a; return this->caracter; } void Start(Teste *ptr) { ptr->caracter = ; } public: void Reset() { Start(this); } };

Figura 5.46: Uso do Ponteiro This

5.28

VARIVEIS ESTTICAS (STATIC)

Uma varivel esttica tem comportamento semelhante ao uma varivel global. Ao declarar uma varivel como esttica (static), apenas uma cpia da varivel (varivel-membro) existe na memria. Uma varivel-membro esttica pode ser de qualquer tipo comum do C++ (por exemplo int, double, oat) ou uma outra classe. Se uma varivel-membro esttica declarada como pblica, as instrues externas classe podem se referir a esta varivel como uma instruo tal como classe::varivel_esttica = x, onde x um valor a ser atribudo a varivel-membro de acesso pblico da classe. Entretanto, assim como com a maioria dos campos de dados e pelas mesmas razes discutidas anteriormente (acesso s variveis de classe, encapsulao), em geral mais apropriado declararmos variveis estticas em reas privadas e protegidas, permitindo assim apenas s funes-membro da classe ou suas derivaes acesso as variveis estticas. Dependendo do propsito do uso de seu objeto, pode existir a necessidade de dois ou mais objetos compartilharem a mesma varivel-membro. Em tais casos, seus programas podem criar uma varivel-membro compartilhada e isto se faz precedendo a declarao da varivel na classe com a palavra-chave static. Por exemplo, na classe Trabalhador, apresentada na Figura 5.47, os objetos compartilham as variveis companhia_seguros e plano_saude. Para o uso de variveis estticas,externamente declarao da classe, deve-se especicar declaraes para as variveis, como as que seguem:
char* Trabalhador::companhia_seguro = ""; char* Trabalhador::plano_saude = "";

onde cada objeto do tipo Trabalhador que for criado mais tarde no programa ir compartilhar estas duas variveis.

82

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

class empregado{ public: Trabalhador(char *nome, long id, int tarefa); void mostra_trabalhador(void); private: char nome[64]; long id; int tarefa; static char *companhia_seguro; static char *plano_saude; };

Figura 5.47: Variveis Estticas

5.29

FUNES-MEMBRO ESTTICAS

Funes estticas tem acesso apenas a variveis de dados estticas da classe. Uma funo-membro esttica no recebe um ponteiro this e portanto, no pode fazer referncia a quaisquer variveis de dados de um objeto da classe. O principal uso de funes-membro estticas para inicializao de um aspecto global da classe que deveria ser aplicado igualmente a todas as variveis de sua classe. Armazenar os passos globais de inicializao em uma funo-membro esttica torna possvel para um programa inicializar a classe para todas as variveis futuras. Funes static podem ser chamadas diretamente sem o uso de um objeto:
class Test{ static void Init() { ...... } }; void main(){ Test::Init(); }

5.30

SOBREPOSIO DE MTODOS

Muitas vezes necessrio redenir uma ao quando se faz uma derivao, ou seja, a classe base age de uma maneira uma mensagem mas a classe derivada deve agir de uma outra forma. Em C++ podemos redenir um mtodo da classe base na classe derivada. Se o nosso ponto 2D possuir um mtodo para mudar a posio:

Programao Orientada a Objetos

83

class Ponto2D { double x; double y; void posicao(double valx, double valy) { x = valx; y = valy; } };

A nossa classe de ponto 3D deve ter um mtodo diferente para acertar a posio:
class Ponto3D : public Ponto2D { double z; void posicao(double valx, double valy, double valz) { x = valx; y = valy; z = valz; } };

5.31

SOBREPOSIO DE OPERADORES

A sobreposio de operadores um mecanismo que nos permite acrescentar novos tipos de dados queles que o C++ foi projetado para manipular. Com a sobreposio de operadores, pode-se criar uma classe e escrever funes que implementam uma operao de soma para duas instncias do tipo da classe. Aps sobrepor o operador de soma, podemos escrever expresses usando o sinal de mais familiar, e o C++ chama funes de operador personalizado para adicionar as instncias da classe. As funes amigas a pouco discutidas so especialmente convenientes quando usadas para redenir operadores. O programa apresentado na Figura 5.48 mostra a limitao do uso de funes operadoras quando funes amigas no so usadas.

5.32

EXERCCIOS

1. Crie uma classe Empresa capaz de armazenar os dados de uma empresa (nome, endereo, cidade, estado, cep e telefone). Inclua um construtor sem argumentos e um que receba os dados como argumetnos e os inicialize. Escreva duas funes, uma para fazer a interface com o usurio da entrada de dados, getData(), e outra para imprimir os dados, putData().

84

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

#include <iostream.h> class ponto { private: int x, y; public: ponto() { x=0; y=0; } ponto(int x1, int y1) { x=x1; y=y1; } ponto operator + (ponto p) { // funcao operadora return ponto(x+p.x, y+p.y); } ponto operator +(int n) { // funcao operadora return ponto (x+n, y+n); } ponto operator -(int n) { // funcao operadora return ponto (x-n, y-n); } void printpt() { cout << "(" << x << "," << y << ")" << endl; } }; void main() { ponto p1(5,1), p2(2,3), p3; p3 = p1 + p2; p3.printpt(); p3 = p1 + 5; // p3 = 5 + p1; Erro, pois o primeiro operando uma constante p3.printpt(); }

Figura 5.48: Sobreposio de Operadores

2. Use a classe Empresa como base para criar a classe Restaurante. Inclua o tipo de comida, o preo mdio de um prato, duas funes construtoras, a interface de entrada de dados, getData(), e a funo que imprima os dados, putData(). Construa um programa para testar a classe Restaurante.

3. Imagine que voc deva escrever um programa para armazenar veculos. Primeiramente, crie a classe Motor que contm NumCilintro (int) e Potencia (int). Inclua um construtor sem argumentos que inicialize os dados com zeros e um construtor que inicialize os dados com os valores recebidos argumento. Acrescente uma funo para a entrada de dados, getData(), e uma funo que imprima os dados, putData().

Programao Orientada a Objetos

85

4. Escreva a classe Veculo contendo Peso em quilos (int), VelocMax em Km/h (int) e preo em R$ (oat). Inclua um construtor sem argumentos que inicialize os dados com zeros e um construtor que inicialize os dados com os valores recebidos como argumento. Acrescente uma funo para a entrada de dados, getData(), e uma funo que imprima os dados, putData(). 5. Crie a classe CarroPasseio usando as classes Motor e Veiculo como base. Inclua cor (string) e Modelo (string). Inclua um contrutor sem argumentos que inicialize os dados com zeros e um construtor que inicialize os dados com os valores recebidos como argumento. Acrescente uma funo para a entrada de dados, getData(), e uma funo que imprima os dados, putData(). 6. Crie uma classe Caminho derivada das classes Motor e Veculo. Inclua Toneladas (carga mxima), Alturamax (int) e Comprimento (int). Inclua um construtor sem argumentos que inicialize os dados com zeros e um construtor que inicialize os dados com os valores recebidos como argumento. Acrescente uma funo para a entrada de dados, getData(), e uma funo que imprima os dados, putData(). 7. Crie um programa que possa testar as classes Motor, Veiculo, CarroPasseio, Caminha e a herana entre elas. 8. Crie um programa que cria uma matriz de Veiculo. Inclua um lao que pergunta ao usurio sobre o tipo de veculo e use o operador new para criar objetos do tipo escolhido (CarroPasseio ou Caminho). Quando o usurio terminar a entrada dos dados de todos os veculos, imprima os resultados usando outro lao. 9. Crie uma classe String que: sobrecarrega o operador + binrio e: a) soma dois objetos String; b) soma uma cadeia de caracteres a um objeto String c) Soma um objeto String a uma cadeia de caracteres. Sobrecarrega o Operador == relacional: d) Compara dois objetos String e) Compara um objeto String com uma cadeia de caracteres f) Compara uma cadeia de caracteres a um objeto String. Sobrecarrega o Operador != relacional: g) Compara dois objetos String;

86

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

h) Compara um objeto String com uma cadeia de caracteres; i) Compara uma cadeia de caracteres a um objeto String. Sobrecarrega o Operador < relacional: j) Compara dois objetos String; k) Compara um objeto String com uma cadeia de caracteres; l) Compara uma cadeia de caracteres a um objeto String. Sobrecarrega o Operador > relacional: m) Compara dois objetos String; n) Compara um objeto String com uma cadeia de caracteres; o) Compara uma cadeia de caracteres a um objeto String. Sobrecarrega o Operador <= relacional: p) Compara dois objetos String; q) Compara um objeto String com uma cadeia de caracteres; r) Compara uma cadeia de caracteres a um objeto String. Sobrecarrega o Operador >= relacional: s) Compara dois objetos String; t) Compara um objeto String com uma cadeia de caracteres; u) Compara uma cadeia de caracteres a um objeto String.

6
LEITURA E GRAVAO EM ARQUIVOS
Para ler entrada a partir de um arquivo seu programa deve criar um objeto do tipo ifstream , o qual denido no arquivo de cabealho fstream.h. Em seguida, o programa deve abrir o uxo de arquivo utilizando a funo-membro ou a funo construtora ifstream. Seu programa pode ento usar o operador de extrao para ler dados do arquivo. Aps ter realizado a operao de leitura do arquivo, ele deve ser fechado utilizando a funo-membro close. O programa apresentado na Figura 6.1 ilustra os passos envolvidos na leitura de um arquivo.

#include <iostream.h> #include <fstream.h> // Inclui o arquivo de cabecalho FSTREAM.H void main(void) { int dado01, dado02, dado03; char texto[256]; ifstream entrada("dados.dat"); entrada.getline(texto, sizeof(texto)); entrada >> dado01 >> dado02 >> dado03; cout << "dado01: " << dado01 << " dado02: " << dado02 << endl; entrada.close(); }

Figura 6.1: Leitura de Arquivos

6.1

GRAVAO DE DADOS EM UM ARQUIVO

Para escrever a sada em um arquivo, seu programa deve criar um objeto do tipo ofstream, o qual denido no arquivo de cabealho fstream.h. A seguir o programa pode usar a instncia (objeto) criada do tipo ofstream para associar o objeto ao arquivo em disco. O programa pode ento usar o operador de insero para escrever os dados para o arquivo. Aps o programa ter escrito sua sada, deve fechar o arquivo utilizando a funo-membro

88

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

close. O programa apresentado na Figura 6.2 ilustra os passos envolvidos para gravar os dados no arquivo:
#include <iostream.h> #include <fstream.h> void main(void) { ofstream saida("dados.res"); // torna saida um tipo ofstream saida << "Informacoes a serem armazenadas no arquivo" << end1; saida << "Corpo do texto ..." << endl; saida << "Ultima linha do texto!" << endl; saida.close(); }

Figura 6.2: Escrita de Arquivos

6.2

EXERCCIOS

1. Escreva um programa que leia um programa-fonte em C++ e verique se o nmero de chaves esquerdas e direitas so iguais. Use argumentos da linha de comando para obter o nome do arquivo. 2. Escreva um programa que leia um arquivo texto e procure a ocorrncia de uma palavra passada como argumento na linha de comando. Imprima o nmero da linha e da coluna em que ela foi encontrada, e imprima a linha em que ela se encontra. 3. Escreva um programa que imprima um arquivo na tela de 20 em 20 linhas. O arquivo de entrada deve ser fornecido na linha de comando. A cada impresso de 20 linhas, o programa aguarda o pressionamento de uma tecla. 4. Modique o programa anterior para que aceite mais 2 argumentos na linha de comandos. O primeiro um nmero inteiro e indica a primeira linha a ser impressa, e o segundo um nmero inteiro que indica a ltima linha linha a ser impressa. 5. Escreva um programa que criptografa um arquivo usando o operador de complemento bit a bit (~). Quando o programa executado para um arquivo j criptografado, o arquivo recomposto e volta ao original.

7
BIBLIOTECA PADRO DE GABARITOS STL

Esta biblioteca, do ingls standard template library, possui vrios contineres prontos para serem usados pelo programador. Dentre elas pode-se citar os contineres vector, list, stack, queue etc. Estes contineres so estruturas j conhecidas pelos programadors como vetor, lista, pilha, la respectivamente. Portanto, nada de reinventar a roda. Se estas estruturas esto prontas basta utiliz-las.

7.1

ARQUIVOS DE CABEALHO DE CONTEINERES DA STL (includes) <vector> <list> <deque> <queue> <stack> <map> <set> <bitset> Descrio resumida

Contm queue e priority_queue Contm map e multimap Contm set e multiset

Os alunos que quiserem saber mais a respeito visite http://www.sgi.com/tech/ stl/ e http://pdpsantos.sourceforge.net/cpptutorial/12_0_stl.html.

90

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

8
EXERCCIOS
Como dica para uma boa programao sempre declare seus mtodos como private e somente acesse-os atravs de funes set e get para cada atributo. Os atributos que no puderem ser congurados, basta no criar o mtodo Set para ele. Caso tenha algum atributo que voc no quer divulgar seu valor basta no criar o mtodo Get para ele. Assuma como padro declarar estes mtodos como SetNomeDoAtributo( parmetros ) e GetNomeDoAtributo( void ). Criao de classes 1. Um laboratrio de mecatrnica critou uma plataforma de navegao autnomo, semelhante ao pathnder que foi a Marte alguns anos atrs. Este rob possui como ambiente uma matriz, por onde ele caminha, podendo ir para frente, para traz, virar, parar etc. Crie a classe Rob e determine seus atriutos sabendo que as funes que ele deve realizar so: Determinar o tamanho mximo do ambiente NxM Congurar a posio inicial do rob na matriz. Andar para frente e para trs recebendo como parmetro o nmero de passos. Ir em frente ou para trs de modo innito at que um comando pare seja dado. Virar para esquerda e para direita recebendo como parmetro o grau de giro. Sempre que o rob andar ele dever mostrar na tela a posio em que se encontra aps a mudana. O rob no pode extrapolar os limites do ambiente. Quando o rob estiver no limite e quiser extrapolar o limite, dever ser enviada uma mensagem dizendo que o rob bateu na parede e automaticamente devese chamar a funo para parar o rob. Implemente o construtor que aceite como parmetro o local inicial do rob. Caso no seja passado nenhum parmetro a informao dever ser lida via teclado. Construa o destrutor do rob.

92

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

2. Crie uma classe chamada Racional para fazer aritimtica com fraes. Escreva um programa para testar sua classe. Utilize variveis inteiras para representar os dados private da classe o numerador e o denominador. Fornea uma funo construtora que permita que um objeto desta classe seja inicializado quando declarado. O construtor deve conter valores default no caso de nenhum inicializador ser fornecido. Fornea funes membro public para cada um dos seguintes itens: Adio, subtrao, multiplicao e diviso de dois nmeros do tipo Racional. Imprimir nmeros do tipo Racional no formato a/b, onde a o numerador e b o denominador. Imprimir nmeros do tipo Racional em formato de ponto utuante. 3. Crie uma classe InteiroGigante que usa um array de dgitos de 40 elementos para armazenar inteiros to grandes quanto 40 dgitos. Fornea as funes membro leiaInteiroGigante, imprimaInteiroGigante, adicioneInteiroGigante e subtraiaInteiroGigante. Para comparar os objetos do tipo InteiroGigante providencia as funes e IgualA, naoEIgualA, eMaiorQue, eMenorQue, eMaiorQueOuIgualA e eMenorQueOuIgualA - cada uma dessas funes umafuno predicado, que simplesmente retorna true se a relao entre os dois inteiros gigantes for verdadeira e retorna false se a relao no for verdadeira. Fornea uma funo predicado eZero. 4. Crie uma classe RoboBrao que possui todas as caractersticas da classe Rob do exerccio a do item 8, mais algumas caractersticas peculiares a ele. Dentre estas caractersticas as seguintes funes: O rob brao deve saber o comprimento do brao e nmero de juntas (graus de liberdade) que ele possui. Pegar um objeto e como parmetro um nmero inteiro identicador do objeto. Soltar um objeto. Jogar um objeto e como parmetro a fora com que o objeto dever ser lanado. Para cada unidade de fora indicada uma casa da matriz sobrevoada pelo objeto. Portanto se jogar o objeto 10 casas ele dever sobrevoar as 10 casas e parar na 11. O objeto no pode ser jogado alm dos limites do ambiente. Neste caso o objeto bate na parede e volta em direo ao rob continuando-se a contar as casas a serem saltadas. Portanto, se o rob est a 5 passos do limite e lana o objeto com uma fora 7, ento o objeto percorrer as cinco casas pegar na parede, sobrevoar 2 casas de volta e parar na terceira casa. 5. Projete a sua classe Ponto, Circulo, Triangulo, Retngulo, Polgono, Pirmide e Cubo. Reutilize o que for necessrio. Implemente o mtodo:

Exerccios

93

construtor que inicializem o objeto para cada classe; para mover o objeto passando como parmetro um novo conjunto de pontos. Retorne algumas dimenses do objeto como, por exemplo, altura, largura, comprimento, rea e volume. A rea e o volume no precisam ser calculados para o polgono. Alguns objetos no possuem algumas dimenses citadas, neste caso no implemente. Por exemplo, ponto no possui comprimento, altura etc. Retngulo no possui altura. 6. Faa uma classe denominada Empregado pai das classes Vendedor, Repositor, Gerente, Coodenador. O salrio depende da categoria do empregado (repositor, vendedor, repositor, coordenador, gerente) que ganham respectivamente 3 salrios, 5 salrios, 8 salrios, 12 salrios. Calcule a folha de pagamento, utilizando polimorsmo, de tal forma, que se for aniversrio do funcionrio ento ele receber 20% de graticao em cima do salrio base. 7. Crie uma classe Retangulo com os mtodos apropriados. 8. Crie um programa com uma classe Pessoa que armazena o nome, ano de nascimento, prosso, salrio, etc. Coloque mtodos apropriados nesta classe. 9. Faa uma classe Lista que implementa uma lista de inteiros usando alocao dinmica. 10. Crie uma classe Complexo que implementa nmeros complexos com operaes de adio, subtrao e multiplicao. As denies das operaes so dadas a seguir.
Se x = y = Entao x + x x*y a + b*i c + d*i y = (a + c) + (b + d)*i y = (a - c) + (b - d)*i = ac - bd + (ad + bc)*i

Como exemplo, o prottipo do mtodo soma seria


que seria usado como \begin{lstlisting}{}x.soma(y); // soma x e y e coloca o resultado em y

11. Discuta brevemente cada um dos seguintes termos: herana, herana mltipla, polimorsmo, varivel polimrca, classe base, classe derivada.

94

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

12. Discuta porque converter um ponteiro para a classe base (superclasse) para um ponteiro para a classe derivada considerado ilegal. 13. E possvel (faz sentido) que o nome de uma classe seja um verbo? Por que? 14. Faa o diagrama de uma hierarquia de classes de seres vivos (animais, primatas, peixe, tubaro, etc). Coloque pelo menos 15 classes. Coloque algumas caractersticas e alguns possveis mtodos de cada uma das classes. 15. E possvel denir uma classe (correta, logicamente) que no possua variveis de instncia ? 16. O que um membro de uma classe? 17. Uma classe Desenho possui um vetor de ponteiros para objetos de Figura (classe dada em aula). Um dos mtodos desta classe dado abaixo.
void Desenho::desenhe() { for ( int i = 0; i ! n; i++ ) v[i]->desenhe(); }

Por que os ponteiros so para Figura e no para uma subclasse Retangulo ou Triangulo? Responda detalhadamente, mostrando exemplos de cdigos que no funcionariam se este vetor no fosse denido como vetor para guras. 18. Baseado na hierarquia
class A { public: virtual void s_virt() { } void r() { } }; class B : public A { public: virtual void m_mirt() { } void n() { } }; class C : public B { public: virtual void s_virt() { } virtual void m_virt() { }

Exerccios

95

}; class D : public A { public: virtual void s_virt() { } void r() { } }; class E : public D { public: void r() { } void k() { } };

responda quais mtodos sero executados pelos comandos abaixo. Alguns dos comandos resultam em erros de compilao. Quando isto acontecer, ignore todos os envios de mensagem at a prxima atribuio.
void { A B C D E main() a, b, c, d, e, *pa *pb *pc *pd *pe = = = = = &a; &b; &c; &d; &e;

pa = pb; pa->n(); pa->r(); pa->s_virt(); pa->m_virt(); pa = pc; pa->n(); pa->m_virt(); pa->s_virt(); pc = pa; pc->s_virt(); pd = pb; pd->r(); pa = pe; pa->s_virt(); pa->k(); pd = pe; pd->s_virt(); pd->r();

96

EDITORA - UFLA-FAEPE - Introduo Linguagem C++

pd->k(); pc = pe; pc->r(); pc->k(); }

19. Subclasses so mais gerais ou especcas do que as superclasses? 20. Explique as vantagens de proteo de informao usando um exemplo! 21. Dena instanciao de um template. Quando ela ocorre? O cdigo dos mtodos do template duplicado em cada instanciao? Por que? 22. Um arquivo pilha.h contm a declarao de uma classe template Pilha. O cdigo dos mtodos est em um arquivo pilha.cpp. O que acontecer se tentarmos usar a classe Pilha em um arquivo aps incluir apenas pilha.h? 23. Faa uma classe template Vetor com mtodos necessrios para manipular um vetor como, por exemplo, inserir um valor na ltima posio, inserir um valor numa posio desejada, recuperar o valor de uma posio etc.

REFERNCIAS BIBLIOGRFICAS

[1] MIZRAHI, VIVIANE V. Treinamento em Liguagem C++ Mdulo 1, Makron Books, 1995. [2] MIZRAHI, VIVIANE V. Treinamento em Liguagem C++ Mdulo. 2, Makron Books, 1995. [3] DEITEL, H. M, C++ Como Programar, ARTMED, 2001.