Introdução à Programação
Orientada a Objetos com C++
Antonio Mendes da Silva Filho
Preencha a ficha de cadastro no final deste livro e receba gratuitamente informações sobre os lançamentos e as promoções da Elsevier.
Consulte também nosso catálogo completo, últimos lançamentos e serviços exclusivos no site
www.elsevier.com.br
Introdução à Programação
Orientada a Objetos com C++
Antonio Mendes da Silva Filho
CIP-Brasil. Catalogação-na-fonte. Sindicato Nacional dos Editores de Livros, RJ
_________________________________________________________________________
_________________________________________________________________________ S58i Silva Filho, Antonio Mendes da
Introdução à programação orientada a objetos com C++ / Antonio Mendes da Silva Filho. – Rio de Janeiro: Elsevier, 2010. ISBN 978-85-352-3702-3
1. Programação orientada a objetos (Computação). 2. C++ (Linguagem de programação de computador) I. Título.
10-0446.
CDD: 005.117 CDU: 004.21 © 2010, Elsevier Editora Ltda.
Todos os direitos reservados e protegidos pela Lei no 9.610, de 19/02/1998.
Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrônicos, mecânicos, fotográficos, gravação ou quaisquer outros.
Copidesque: Ivone Teixeira Revisão: Marco Antônio Corrêa
Editoração Eletrônica: SBNigri Artes e Textos Ltda.
Elsevier Editora Ltda. Conhecimento sem Fronteiras Rua Sete de Setembro, 111 – 16o andar
20050-006 – Centro – Rio de Janeiro – RJ – Brasil Rua Quintana, 753 – 8o andar
04569-011 – Brooklin – São Paulo – SP – Brasil Serviço de Atendimento ao Cliente
0800-0265340 [email protected] ISBN 978-85-352-3702-3
Nota: Muito zelo e técnica foram empregados na edição desta obra. No entanto, podem ocorrer erros de digitação, impressão ou dúvida conceitual. Em qualquer das hipóteses, solicitamos a comunicação ao nosso Serviço de Atendimento ao Cliente, para que possamos esclarecer ou encaminhar a questão.
Nem a editora nem o autor assumem qualquer responsabilidade por eventuais danos ou perdas a pessoas ou bens, originados do uso desta publicação.
Dedicatória
À minha esposa Viviane e aos filhos Vivian e Anthony, em reconhecimento aos
muitos momentos de convívio cedidos e constante apoio dado durante a realização
deste livro. Ao meu pai Antonio e à minha mãe Eunide (
in memoriam) pelo ininterrupto
afeto e simplicidade dos ensinamentos.
Sobre o Autor
Professor e consultor em área de Tecnologia da Informação e Comunicação,
com mais de 20 anos de experiência profissional, é autor do livro
Arquitetura de Software,
pela Editora Campus/Elsevier, possui diversos artigos publicados em eventos
nacio-nais e internacionacio-nais, é colunista de Ciência e Tecnologia na revista
Espaço Acadêmico,
com mais de cem artigos publicados, tendo feito palestras em eventos nacionais e no
exterior. Foi professor visitante da University of Texas, em Dallas, e da University of
Ottawa. Formado em Engenharia Elétrica pela Universidade de Pernambuco, com
mestrado em Engenharia Elétrica pela Universidade Federal da Paraíba (Campina
Grande), mestrado em Engenharia da Computação pela University of Waterloo e
doutorado em Ciência da Computação pela Univesidade Federal de Pernambuco.
Agradecimentos
Este livro é um relato de recente trabalho na área de introdução à programação
em cursos de computação e engenharias. Ao longo de minha jornada como docente,
tive a oportunidade de trocar ideias e interagir com alunos e outros interessados e
pude perceber que o aprendizado é um processo que se constrói passo a passo.
Nes-se processo, utilizar exemplos e levantar questionamentos sobre possíveis soluções
ajuda o aluno (aprendiz) a assimilar de maneira mais efetiva o conteúdo. Agradeço
a cada um dos alunos que ao longo de anos de ensino contribuíram com perguntas
e curiosidades para a formação desse conteúdo. Também gostaria de agradecer aos
colegas por serem pacientes com minha falta de atenção e afastamento enquanto
escrevia este livro. Por fim, gostaria também de agradecer à Editora Campus/Elsevier
e a toda equipe pelo empenho e dedicação na realização deste livro.
Antonio Mendes da Silva Filho
A quem se destina o livro
Quem deve ler e beneficiar-se deste livro? Ele é recomendado a estudantes dos
cursos de computação, engenharias e correlatos de universidades e outras instituições
de ensino superior, uma vez que contempla o conteúdo exigido nesses cursos.
Apresentação
A programação orientada a objetos (POO) é uma abordagem de
programa-ção que serve de elo entre os problemas existentes e as soluções computacionais
apresentadas no campo da programação. Antes da POO havia um obstáculo
con-ceitual para os programadores quando eles tentavam adaptar as entidades reais às
restrições impostas pelas linguagens e técnicas de programação tradicionais. Em uma
situação real, o ser humano tende a raciocinar em termos dos objetos ou entidades
reais. Todavia, vale lembrar que, antes da POO, os programadores eram ensinados a
raciocinar sobre os problemas em termos de blocos de código ou procedimentos e
forma como eles atuavam sobre os dados. Observe que essas duas abordagens são
distintas e constituem um problema quando existe necessidade de desenvolver um
sistema complexo.
A POO apresenta-se como um paradigma de programação que permite aos
programadores raciocinar e solucionar problemas em termos de objetos, os quais
estão diretamente associados às entidades ou “coisas” reais. Como resultado desse
mapeamento natural, utilizando a POO um programador pode concentrar-se nos
objetos que compõem o sistema, em vez de tentar vislumbrar o sistema como um
conjunto de procedimentos e dados. Vale salientar que a POO é uma forma natural
e lógica pela qual os seres humanos, especificamente os programadores, raciocinam.
Os benefícios resultantes de empregar a POO como abordagem de programação não
se restringem a raciocinar e resolver problemas em termos de objetos ou entidades
reais, mas implicam a reutilização de código.
Além da identificação de uma técnica de programação adequada para
imple-mentação de sistemas, há a necessidade de selecionar uma linguagem de programação.
Neste texto, é empregada a linguagem C++ desenvolvida nos laboratórios da Bell por
Bjarne Stroustrup. Embora a C++ mantenha algumas semelhanças com a linguagem
C, oferece menor possibilidade de erros. Além disso, a C++ suporta características
como, por exemplo, polimorfismo, herança e ocultação de dados, entre outras. Na
prática, as diferenças entre C e C++ são maiores do que se possa imaginar.
Programa-dores de C++ não apenas fazem uso dos aspectos da POO de C++ como também
incrementam e aperfeiçoam os recursos oferecidos pela linguagem C. Nesse sentido,
o objetivo deste livro é ajudar o leitor a solucionar problemas escrevendo programas
em C++ e explorando recursos da orientação a objetos no menor tempo possível.
Devido ao exposto e à grande importância que a POO tem no contexto atual
entre os paradigmas de programação, um texto didático que faça a introdução de
pro-gramação orientada a objetos usando a linguagem C++ tem como objetivo fornecer
os conceitos necessários aos estudantes de computação, engenharias e áreas afins.
Sumário
Capítulo 1 – panorâmiCada programação orientadaa objetos ...1
Objetivos ...1
1.1. Introdução ...1
1.2. Origem da Programação Orientada a Objetos ...2
1.3. Limitações das Linguagens Procedimentais ...3
1.3.1. Linguagens Procedimentais ...3
1.3.2. Divisão do Programa em Funções ...4
1.3.3. Programação Estruturada ...4
1.3.4. Dados – Componente Essencial na Modelagem de um Sistema ...5
1.3.5. Uso de Variáveis em Linguagens de Programação Estruturada ...5
1.3.6. Problemas de Programas Procedimentais ...7
1.4. Características das Linguagens Orientadas a Objetos ...7
1.4.1. A Abordagem de Orientação a Objetos ...7
1.4.2. Encapsulamento de Dados ...8
1.4.3. Raciocínio em Termos de Objetos ...9
1.4.4. Classe ...9
1.4.5. Herança ...10
1.4.6. Reusabilidade ...11
1.4.7. Criação de Novos Tipos de Dados ...11
1.4.8. Polimorfismo e Overloading (Sobrecarga) ...12
1.5. Diferenças entre C e C++ ...12
Resumo ...13
Questões ...13
Exercícios ...13
Capítulo 2 – Componentesda linguagem C++ ...15
Objetivos ...15
2.1. Introdução ...15
2.2. Construção de um Programa ...16
2.2.1. Criando um Projeto no Ambiente Dev-C++ ...16
2.2.2. Criando um Arquivo no Dev-C++ ...17
2.2.3. Removendo ou Renomeando um Arquivo ...18
2.2.4. Compilando e Executando um Programa no Dev-C++ ...19
2.2.5. Entendendo o Programa em C++ ...20
2.2.6. A Função main() ...21
2.2.7. Comentários ...22
2.3. Uso de Cout ...22
2.3.1. Entendendo o uso do Objeto cout ...23
2.3.2. Operador << ...23
2.4. Diretivas do Pré-processador ...23
2.4.1. Diretivas do Pré-processador ...23
2.4.2. Diretiva #define ...24
2.5. Uso de Variáveis ...25
2.5.1. Variáveis do Tipo Inteiro ...26
2.5.2. Nomes de Variáveis ...27
2.6. Entrada Usando CIN ...27
2.6.1. Entendendo o Uso do Objeto cin ...27
2.6.2. Operador >> ...27
2.7. Manipuladores ...29
2.7.1. Entendendo Manipuladores ...29
2.7.2. Operador endl ...30
2.7.3. Operador setw ...32
2.8. Tipos de Variáveis (Dados) ...33
2.8.1. Constantes do Tipo Inteiro ...34
2.8.2. Variáveis do Tipo char ...34
2.8.3. Constante do Tipo char...34
2.8.4. Variáveis do Tipo Ponto Flutuante ou Real ...35
2.8.5. Qualificador const ...37
2.8.6. Tipo de Dados long ...37
2.8.7. Definições Múltiplas ...38
2.8.8. Sumário de Tipos de Variáveis ...38
2.8.9. Tipos de Dados unsigned ...40
2.9. Conversão de Tipos ...42
2.9.1. Conversões Automáticas ...43
2.9.2. Casts ...43
2.10. Operadores Aritméticos ...45
2.10.1. Operadores de Atribuição Aritmética ...46 2.10.2. Operadores de Incremento ...47 2.11. Funções de Biblioteca ...48 Resumo ...50 Questões ...50 Exercícios ...50
Capítulo 3 – laçose deCisões ...53
Objetivos ...53 3.1. Introdução ...54 3.2. Operadores Relacionais ...54 3.2.1. Operadores Relacionais ...55 3.3. Laços ...56 3.3.1. Laço for ...56 3.3.2. Instrução for ...58 3.3.3. Loop while...61 3.3.4. Loop do ...64 3.4. Decisões ...66 3.4.1. if... else...66
3.4.2. Aninhamento (Nesting) de ifs (dentro de laços) ...68
3.4.3. if... else...69
3.4.4. Função getche() ...71
3.4.5. if... else aninhados ...72
3.4.6. else... if ...75
3.4.7. Switch ...76
3.4.8. Operador Condicional ...79
3.5. Operadores Lógicos ...81
3.5.1. Operador Lógico E (AND) ...81
3.5.2. Operador Lógico OU (OR) ...83
3.5.3. Operador Lógico NÃO (NOT) ...84
3.6. Expressões Lógicas ...85
3.7. Precedência de Operadores ...86
3.8. Mais Mecanismos de Controle ...87
3.8.1. Break ...87 3.8.2. Continue ...87 Resumo ...89 Questões ...89 Exercícios ...90 introd_00.indd 17 12/4/2010 10:30:06
Capítulo 4 – estruturas ...91 Objetivos ...91 4.1. Introdução ...92 4.1.1. Estrutura ...92 4.2. Estruturas Simples ...92 4.1.1. Estrutura ...92 4.3. Especificação de Estrutura ...94 4.3.1. Definição de Estrutura ...94
4.3.2. Definição de uma Variável do Tipo Estrutura ...95
4.4. Acesso a Membros de Estrutura ...95
4.4.1. Acesso a Membros de Estrutura ...95
4.4.2. Definição de Estruturas sem Rótulo (tag) ...95
4.4.3. Inicialização de Membros da Estrutura ...96
4.4.4. Estruturas Dentro de Estruturas ...100
4.4.5. Tipos de Dados Enumerados (Enumerated Data Types)...100
4.4.6. Especificador enum ...102
4.5. Estruturas e Classes ...105
4.5.1. Estruturas ...105
4.5.2. Classes ...105
4.5.3. Diferenças entre Estruturas e Classes ...105
Resumo ...106 Questões ...106 Exercícios ...106 Capítulo 5 – Funções ... 107 Objetivos ...107 5.1. Introdução ...108 5.1.1. Função ...108 5.1.2. Sintaxe de Função ...108
5.2. Passagem de Argumentos em Funções ...111
5.2.1. Passagem de Argumentos ...111
5.3. Retorno de Valores de Funções ...116
5.3.1. Definição de Tipo de Retorno ...118
5.4. Argumentos de Referência...118
5.4.1. Variável de Referência ...118
5.4.2. Passagem de Argumento por Referência ...119
5.4.3. Usando Referência para Retornar Valores ...121
5.5. Funções Sobrecarregadas ...122
5.6. Funções Inline ...124
5.6.1. Problema com Inserção Repetida de Função ...124
5.6.2. Função inline ...125
5.7. Retorno por Referência ...128
5.7.1. Referência ...128
5.7.2. Função Retornando Referência ...128
5.8. Tópicos Complementares ...129
5.8.1. Argumentos Default ...129
5.8.2. Categorias de Variáveis e Armazenamento (ou Memória) ...132
5.8.3. Variável automatic ...132
5.8.4. Tempo de Vida de Variável ...133
5.8.5. Visibilidade de Variável ...133 5.8.6. Variáveis Locais ...133 5.8.7. Variável External ...134 5.8.8. Variáveis Globais ...134 Resumo ...136 Questões ...136 Exercícios ...137
Capítulo 6 – objetose Classes ... 139
Objetivos ...139
6.1. Introdução ...139
6.1.1. Objetos e Classes ...140
6.1.2. Atributos e Operações em Classes ...140
6.1.3. Mensagens (Funções-membros) ...140
6.1.4. Herança ...140
6.1.5. Polimorfismo ...140
6.1.6. Encapsulamento ...141
6.1.7. Abstração (de Dados) ...141
6.1.8. Exemplificando uma Classe ...141
6.1.9. Ocultação de Dados ...142 6.1.10. Dado private...143 6.1.11. Função public ...143 6.1.12. Função-membro ...143 6.2. Objetos C++ ...144 6.3. Classes e Objetos...146
6.3.1. Classes, Objetos e Memória ...146
6.3.2. Objetos C++ como Tipos de Dados ...147
6.4. Construtores e Destrutores ...149
6.4.1. Construtor ...149
6.4.2. Inicialização com Construtor ...151
6.4.3. Destrutor ...152
6.5. Objetos como Argumentos e Retorno de Função ...152
6.5.1. Objetos como Argumentos de Função ...152
6.6. Retorno de Objetos de Funções ...156
6.7. Abstração e Encapsulamento ...157
6.7.1. Abstração ...157
6.7.2. Encapsulamento ...157
6.8. Dados de Classe static ...160
6.8.1. Dado-membro static ...160 Resumo ...163 Questões ...163 Exercícios ...163 Capítulo 7 – arrays ...165 Objetivos ...165 7.1. Introdução ...165 7.1.1. Arrays ...165 7.1.2. Definição de Arrays ...166
7.1.3. Diferença entre Arrays e Estruturas...166
7.2. Princípios de Uso de Arrays ...166
7.2.1. Regras para Declaração de Array ...167
7.3. Declaração, Inicialização e Acesso De Arrays ...170
7.3.1. Declaração de Array ...170
7.3.2. Inicialização de Array ...170
7.3.3. Arrays de Múltiplas Dimensões ...172
7.3.4. Formatação de Números Decimais ...174
7.4. Arrays como Dado de Classe ...176
7.4.1. Pilha – Estrutura de Dado ...177
7.4.2. Operação da Pilha ...179
7.5. Arrays de Objetos ...179
7.6. Strings e Arrays ...181
7.6.1. Função cin::get() ...186
7.6.2. Usando get() para Ler Múltiplas Linhas ...187
7.6.3. Função strcpy ...187
7.6.4. Função strlen() ...188
7.6.5. Array de strings ...191
7.6.6. Strings como Membros de Classes ...192
Resumo ...194
Questões ...194
Exercícios ...194
Capítulo 8 – sobreCargade operadores ... 195
Objetivos ...195
8.1. Introdução ...195
8.1.1. Sobrecarga de Operadores ...196
8.2. Sobrecarga de Operadores Unários...196
8.3. Sobrecarga de Operadores Binários ...205
8.4. Sobrecarga de Operadores Associados a Funções ...213
8.4.1. Sobrecarga do Operador [ ] ...213
8.5. Conversão de Dados ...215
8.6. Funções Friend ...219
8.7. Aplicações e Restrições de Uso ...222
8.7.1. Conversão entre Objetos de Classes Diferentes ...222
Resumo ...225 Questões ...225 Exercícios ...226 Capítulo 9 – Herança ...227 Objetivos ...227 9.1. Introdução ...228 9.1.1. Herança ...228 9.1.2. Classe Derivada ...228 9.1.3. Importância da Herança ...228 9.1.4. Reusabilidade ...228
9.2. Classes Base e Derivada ...228
9.3. Construtores de Classe ...232
9.3.1. Construtores de Classes Derivadas ...232
9.4. Herança em Classe ...235
9.4.1. Ignorando Funções-membros ...235
9.5. Hierarquia e Níveis de Classe ...238
9.5.1. Classe Abstrata ...242
9.6. Herança com public e private ...242
9.6.1. Herança usando public e private ...242
9.6.2. Níveis de Herança ...245
9.7. Herança Múltipla ...249
9.7.1. Ambiguidade em Herança Múltipla ...253
Resumo ...253
Questões ...254
Exercícios ...254
Capítulo 10 – ponteirose apliCações ...255
Objetivos ...255
10.1. Introdução a Ponteiros ...256
10.1.1. Ponteiros ...256
10.1.2. Entendendo Ponteiros ...256
10.2. Operadores Endereço e Ponteiro ...257
10.2.1. Operador de Endereço ...257
10.3. Operações com Ponteiros ...260
10.4. Objetos Dinâmicos com Ponteiros ...263
10.4.1. Alocação Dinâmica de Memória ...264
10.5. Ponteiros como Argumentos ...268
10.6. Classes Lista, Pilha e Fila...270
10.6.1. Lista ...270 10.6.2. Pilha ...271 10.6.3. Fila ...273 Resumo ...275 Questões ...275 Exercícios ...275
Capítulo 11 – eduCação Continuada ...277
Objetivos ...277 11.1. Retrospecto ...277 11.2. Prospecto ...280 11.3. Aplicações na Engenharia ...282 11.4. Sugestões de Leitura ...283 introd_00.indd 22 12/4/2010 10:30:07