sobre a Lísias

nosso e-mail

venda de produtos/serviços


Livro de C++ (Orientação a Objetos com C++)

forma de venda

Preço nas livrarias:
R$ 35,00 ou compra pela internet direto da Lísias: R$ 29,00 (cobrança via boleto bancário. Você recebe o livro e o boleto pelo correio e depois paga em qualquer banco). Você também pode utilizar seu cartão de crédito.



ISBN: 85-87147-04-8

Formato: 15x21 cm

Páginas: 224

Colorido: sim

Todos os programas fontes dos exemplos e mais os fontes dos exercícios resolvidos, você os receberá gratuitamente pela internet, basta informar o número de série do seu livro

 

A linguagem C++ é a linguagem mais utilizada no mundo para criar softwares competitivos. Esta linguagem possui inúmeros fabricantes de compilador. é uma linguagem praticamente universal no seu sentido mais amplo: quantidade de usuários, existe um compilador para todas as plataformas (Unix, Linux, Windows, OS/2 ...), sucesso no desenvolvimento de aplicativos, acesso à base de conhecimento, desempenho em pontos críticos e assim por diante.

Os aperfeiçoamentos do C++ em relação ao C
Mesmo que você não queira utilizar a Orientação a Objetos vale a pena aprender os vários melhoramentos que foram feitos no C++ com relação a linguagem C.

Classes: base da Orientação a Objetos
A idéia de trabalhar com classes vem do fato dos estudiosos da Orientação a Objetos terem procurado aproximar o máximo possível o desenvolvimento de software das idéias intuitivas do homem. O fundamento principal que está por trás dos conceitos de classe é o encapsulamento. Pilar de sustentação de todos os conceitos. Neste livro você entenderá com facilidade como classes são implementadas fisicamente (programadas) e principalmente perceberá a importância dos conceitos atrelados a implementação física para conseguir criar aplicativos competitivos.

Objetos: uma outra visão de como são criados
Você aprenderá a trabalhar com objetos. No exemplo do tópico anterior você já pode observar a criação de um objeto.

Gerando objetos de forma dinâmica
Alocar e liberar objetos de forma dinâmica é umas das partes mais complexas do C++ porque envolve um tratamento intenso de ponteiros. Devido a isso, no livro da Lísias Editora você tem um exemplo extremamente didático no qual é ensinada a alocação dinâmica em detalhes.

a seguir está a demonstração de como livro faz um detalhamento linha a linha do que acontece em termos de memória com o exemplo do link acima (entendendo este exemplo, você nunca mais terá dúvidas com ponteiros).

O primeiro comando é a criação de um objeto que é um ponteiro: "Aluno *pobjLigados;" Este ponteiro guarda a ligação com o objeto criado. A seguir inicializamos uma matriz para recebimento (linha 32) do nome e iniciamos um loop para recebimento destes nomes e a criação dos objetos. Observe a linha 36 "pobjLigados = new Aluno( aszNome );". Nesta linha alocamos memória para dados do tipo Aluno. O endereço do ínicio deste bloco de memória é atribuído a objLigados e ainda nesta linha, new invoca a construtora de Aluno passando para ela um argumento que é o endereço de aszNome.

Na construtora (que inicia na linha 21) o primeiro comando também é uma alocação dinâmica de memória, porém agora, somente estamos alocando memória para um membro-de-dado do objeto criado, "pszNmAluno = new char[strlen(pszNomeAluno)+1];". Observe que nesta linha alocamos memória com tamanho determinado e o endereço do início deste bloco é guardado no ponteiro pszNmAluno. Copiamos o parâmetro recebido para o endereço alocado (linha 23) e a seguir testamos se o membro-de-dados static pObjetoAnterior está vazio (NULL). Como é a primeira vez que a construtora é executada, o conteúdo de pObjetoAnterior realmente é nulo e por isso o processamento passa para a linha que segue ao else. Nesta linha (28) atribuimos ao membro-de-dado static pPrimeiroObjeto, o endereço do objeto atual (this). Neste ponto é importante que você visualize qual é a imagem da memória até aqui:

A construtora termina após ter sido atribuido ao membro-de-dado static pObjetoAnterior o endereço do objeto atual utilizando o operador this (linha 29). A partir de agora todo o processo reinicia (voltando o processamento para a linha 37 onde o usuário digita qualquer tecla diferente de [Esc] (valor ASCII 27) para entrar com um novo nome de aluno). Na primeira vez o usuário entrou com o nome "João", digamos que agora ele entre com o nome "José". A imagem da memória com o segundo objeto será a seguinte:

A Figura 5.4 demonstra como fica a memória quando termina a construtora na montagem do segundo objeto. Para que a demonstração não deixe dúvidas, faremos com que seja acrescentado mais um objeto. Digamos que o usuário resolveu entrar com o último nome de aluno que é "Juca". A memória terá a seguinte configuração ...

e assim segue todo o capítulo, até que todas as linhas tenham sido minuciosamente explicadas.

Sobrecarga de operadores: diminuindo a necessidade de conhecimento
Com a sobrecarga de operadores diminui a necessidade de conhecimento de todas as funções do sistema por parte do desenvolvedor. Por exemplo, se para somar duas variáveis do tipo inteiro é utilizado o operador '+', para somar dois objetos que tenham o mesmo tipo ou não, também pode-se utilizar o operador '+', desde que este tenha sido sobrecarregado pela 'Equipe Master de Desenvolvimento'. Isto torna o trabalho de desenvolvimento intuitivo e a produtividade aumenta significativamente. Este procedimento certamente diminuiu a necessidade de procura, leitura e entendimento, pois no caso do exemplo, o desenvolvedor simplesmente invocaria o operador '+', sem ter que descobrir qual é a função que executa tal tarefa. O exemplo a seguir demonstra a implementação da sobrecarga.

Herança: uma idéia intuitiva e fundamental
O grande benefício da Herança (um dos dois pilares da Orientação a Objetos - o outro é o encapsulamento através de classes) é a reutilização de código. é com a Herança que você dará o "pulo-do-gato" em termos de produtividade na construção de sistemas e mais ainda na facilidade de fazer mudanças neste sistema. Agora tenha em mente o seguinte: o segredo da herança está em definir corretamente as classes na fase de análise. Neste livro (Desenvolvedor Profissional - Orientação a Objetos com C++) você verá modelos lógicos predefinidos (análise acabada), fáceis e simples de compreender.

O modelo lógico (análise de sistemas) será implementado fisicamente (programado) em C++ conforme demonstrado a seguir

 

Polimorfismo: deixe que o compilador trabalhe por você
Polimorfismo é a capacidade do compilador decidir qual deve ser a função (método) a ser executada, dependendo do tipo do objeto em foco. Este é um fator decisivo na produtividade de uma equipe de desenvolvimento. Mais uma vez aqui o segredo está em definir corretamente as classes e a hierarquia de herança na fase de análise. Um outro detalhe importantíssimo é que o polimorfismo também auxilia um aspecto fundamental no sucesso de um aplicativo, que é a capacidade deste poder sofrer mudanças. Neste capítulo você também verá modelos lógicos (Análise) já prontos, conforme o exemplo a seguir.

O modelo lógico (análise de sistemas) será implementado fisicamente (programado) utilizando-se o polimorfismo conforme demonstram os links a seguir

Clique aqui para ver a programação da classe Aluno

O livro também demonstra a programação das outras duas classes

Um estudo de um sistema Orientado a Objetos: IOStream
No final do livro está o estudo completo de um sistema Orientado a Objetos. No caso, o sistema de fluxo de entrada e saída de dados do C++. Saiba também como você pode gravar em arquivo objetos que estão em herança. Você irá estudar uma série de classes definida em hierarquia conforme o modelo lógico definido no link seguir.

Templates: menos programação
Você aprenderá que pode criar gabaritos que constroem funções ou classes genéricas. é um assunto interessante pois ajuda a poupar tempo de programação. No exemplo do link a seguir você tem a definição de um exemplo clássico de função template.

Por que aprender a desenvolver programas em C++ parece ser difícil?
Para aprender C++ é indispensável que você já tenha aprendido a Linguagem C, caso você ainda não conheça esta linguagem veja o livro Linguagem C da Lísias Editora. Isto porque C++ utiliza todo o conjunto da Linguagem C e acrescenta a esta os conceitos de Orientação a Objetos. Os conceitos Orientados a Objetos não são difíceis de serem aprendidos, a dificuldade da maioria dos estudantes está no fraco conhecimento de ponteiros (principalmente), alocação dinâmica e estruturas. Estes são pontos fundamentais a serem entendidos para que você possa programar em C++. Um outro segredo está na forma de começar a estudar e a partir de que ponto. O Livro da Lísias Editora faz com que você inicie de forma correta.

Por que este livro é bom?
Porque todos os tópicos fundamentais tem exemplificação prática, isto permite a você qualificar a importância de um conceito e como este se aplica em um contexto de programação. Todos os exemplos/exercícios do livro são pequenos (nenhum ocupa mais de uma página). Você não terá que analizar dezenas de linhas de código para entender um determinado tópico. O autor gastou inúmeras horas de estudo e planejamento para levar à você exemplos didáticos, simples e claros de assuntos complexos. Os Exemplos não querem provar o quão engenhoso é o autor e sim ensinar.

Você aprenderá como definir fisicamente (programação) modelos lógicos (análise) de forma Orientada a Objetos. Isto em cima de modelos práticos, do dia a dia, que você consegue entender rapidamente, sem divagar e gastar muito tempo sobre modelos complexos.

O livro mostra claramente os detalhes que não aparecem no código escrito e que são fundamentais para o entendimento. Estes detalhes sempre são colocados em destaque (vermelho) em modelos (programas) práticos. Estes destaques apontam diretamente para aquilo que está em estudo.

Sumário do livro de C++
1. Entrada e Saída de dados em C++

1.1 Saída de dados

1.1.1 Objeto de saída de dados: cout

1.1.2 Operador de direcionamento de saída:

1.1.3 Saída de dados em outro padrão de código

1.1.4 Saída de erros: cerr

1.2 Entrada de dados

1.2.1 Objeto de entrada de dados: cin

1.2.2 Operador de direcionamento de entrada: >>

2. Aperfeiçoamentos do C++ em relação ao C

2.1 Novas palavras-chave

2.2 Protótipos de funções são obrigatórios

2.3 Valores de argumentos de função 'default'

2.4 Mais um formato para comentário

2.5 Operador de escopo de variável global "::"

2.6 Qualificador de variável: const

2.7 Tipo de dado: enum

2.8 Definindo uma função como sendo inline

2.8.1 Por que não macro no lugar de inline?

2.8.2 Tamanho de uma função inline

2.8.3 Como inline funciona?

2.8.4 Onde definir funções inline?

2.8.5 Vantagens de funções inline

2.8.6 Qual o problema de uma função inline?

2.8.7 Exemplo de utilização de função inline

2.9 Local da declaração de variáveis

2.10 União anônima

2.11 Alocação de memória aperfeiçoada (free store)

2.11.1 Alocação dinâmica com new e delete

2.11.2 Memória indisponível

2.11.3 Operador new com ponteiros far

2.12 Sobrecarregando funções

2.13 Estruturas em C++

2.13.1 Estruturas com funções

2.13.2 Definindo a função dentro da estrutura

2.13.3 Como enviar um parâmetro a uma função-membro

2.13.4 Definindo múltiplas instâncias de uma estrutura

2.13.5 Funções sobrecarregadas em estruturas

3. Referência

3.1 O que é uma referência?

3.2 Onde utilizar referências?

3.2.1 Passando parâmetros por referência

3.2.1.1 Quando há benefício em utilizar passagem por referência?

3.2.2 Retornando por referência

3.2.2.1 Não retorne referência de dados locais

3.3 Onde a utilização de referência é fundamental?

3.4 Não utilize referência com tipos de dados 'default'

3.4.1 Variáveis temporárias ocultas

3.5 Referência a ponteiro

3.6 Quando é melhor utilizar ponteiro?

3.7 Referência não é ponteiro

4. Classes

4.1 O que é uma classe?

4.2 Sintaxe da descrição de uma classe

4.3 Membros de uma classe

4.3.1 As três seções de uma classe para acesso a membro

4.3.1.1 Seção private

4.3.1.2 Seção protected

4.3.1.3 Seção public

4.3.2 Descrição dos tipos de membros de uma classe

4.3.2.1 Membro: Dado

4.3.2.2 Membro: Funções-membro ou métodos

4.3.2.2.1 Tipos de funções-membro ou métodos

4.3.2.2.1.1 Função membro construtora ou método contrutor

4.3.2.2.1.1.1 Método construtor inicializa um objeto da classe

4.3.2.2.1.1.2 Quando é executado um método construtor

4.3.2.2.1.1.3 Método construtor (função construtora) sobrecarregado

4.3.2.2.1.2 Função-membro destrutora ou método destrutor

4.3.2.2.1.3 Função membro ou método

4.3.2.2.1.3.1 Tipos de funções-membro ou métodos

4.3.2.2.1.3.1.1 Método regular

4.3.2.2.1.3.1.2 Método friend

4.3.2.2.1.3.1.3 Método virtual

4.3.2.2.1.3.2 Como relacionar uma função-membro de uma classe

4.3.2.2.2 Local de definição do código

4.3.2.2.2.1 Código de método definido de forma inline

4.3.2.2.2.2 Código de método definido fora da classe

4.3.3 Visibilidade para acesso a um objeto (Escopo)

4.4 Utilizando classes na prática

4.4.1 Classes derivam de estruturas

4.4.2 Entendendo o que é um objeto

4.4.3 Utilizando método construtor e código inline

4.4.3.1 Sobrecarregando métodos construtores

4.4.3.2 Função construtora com valores de argumentos default

4.4.4 Função-membro destrutora ou método destrutor

4.4.4.1 Evitando um erro comum na utilização de destrutores

4.4.5 Acessando dados privados de uma classe

4.4.6 Friend

4.4.6.1 Tipos de métodos friend

4.4.6.1.1 Métodos friend membros de outra classe

4.4.6.1.1.1 Toda a classe é friend

4.4.6.1.1.2 Somente um ou alguns métodos são friend

4.4.6.1.2 Funções friend isoladas

4.4.6.2 Referência entre classes

4.4.7 Ponteiro this

4.4.7.1 Retornando um objeto com *this

4.4.7.2 Ponteiro this sendo utilizado em objetos dinâmicos

4.4.8 Matrizes de objetos

4.4.8.1 Método construtor com matrizes

4.4.8.2 Método destrutor com matrizes

4.4.8.2.1 Deleção de matriz-de-objetos-ponteiro

4.4.9 Declaração de visibilidade e tempo de vida em classes

4.4.9.1 Visibilidade e tempo de vida de extern, auto e register

4.4.9.2 Visibilidade e tempo de vida static

4.4.9.2.1 Membro-de-dado declarado como static

4.4.9.2.2 Um método declarado como static

4.4.9.2.3 Declarando um objeto (classe) como static

5. Gerando objetos de forma dinâmica

6. Sobrecarga de operadores (overload)

6.1 Operadores que não podem ser sobrecarregados

6.2 Operadores que podem ser sobrecarregados

6.2.1 Operadores unários

6.2.2 Operadores binários

6.2.3 Operadores mistos

6.3 O que não pode ser feito na sobrecarga

6.4 Maneiras de sobrecarregar operadores

6.4.1 Sobrecarregando com método operador

6.4.1.1 Sintaxe da sobrecarga com método operador

6.4.1.2 Exemplo de sobrecarga com método operador

6.4.2 Sobrecarregando com método friend

6.4.2.1 Sintaxe da sobrecarga com método friend

6.4.2.2 Exemplo de sobrecarga com método friend

6.4.3 Sobrecarregar com método operador ou com método friend?

6.5 Criando objetos auxiliares

6.5.1 Evitando o objeto auxiliar, criando objeto sem nome

6.6 Exemplos de sobrecarga de operadores

6.6.1 Sobrecarga do operador = para atribuir uma string

6.6.2 Sobrecarga do operador = para retornar um objeto com this

6.6.3 Sobrecarga dos operadores de pré e pós-incremento

6.6.4 Sobrecarga do operador +=

7. Conversão de classes

7.1 Método construtor de conversão

7.1.1 Sintaxe de um construtor de conversão

7.1.2 Exemplo de conversão com construtor de conversão

7.2 Método conversor ou Função-membro de conversão

7.2.1 Sintaxe de método conversor

7.2.2 Exemplo de conversão com método conversor

7.2.3 Restrições a um método conversor

7.3 Convertendo classes entre si

7.4 Modos de ativar funções de conversão

7.5 Contextos que podem receber um tipo de dado diferente

7.6 Conversões geram objetos temporários

8. Herança

8.1 Herança simples

8.1.1 Membros protected

8.1.2 Sintaxe da declaração de herança simples

8.1.2.1 Modificador de acesso

8.1.2.1.1 Modificador public

8.1.2.1.2 Modificador private

8.1.3 Construtores na herança simples

8.1.3.1 Sintaxe do construtor da classe-derivada

8.1.4 Métodos com nomes idênticos na classe-base e derivada

8.1.5 Exemplos de herança simples

8.1.5.1 Exemplo de herança simples com um nível de especialização

8.1.5.2 Exemplo de herança simples com dois níveis de especialização

8.1.6 Métodos destrutores na herança simples

8.1.7 Criando ponteiros para classes-base e derivadas

8.1.8 Criando referências para classes-base e derivadas

8.2 Herança Múltipla

8.2.1 Sintaxe da declaração de herança múltipla

8.2.2 Construtores na herança múltipla

8.2.2.1 Sintaxe do construtor da classe-derivada

8.2.3 Exemplo de herança múltipla

8.2.4 Métodos destrutores na herança múltipla

8.2.5 Ocorrência de ambig�idades em herança múltipla

8.2.5.1 Ambig�idade com membros homônimos nas classes-base

8.2.5.2 Ambig�idade com dados duplicados para a classe-base

8.2.6 Classe-base virtual

8.2.6.1 Sintaxe da declaração de classe-base virtual

8.2.6.2 Ocorrência da duplicação de membros-de-dado

8.2.6.3 Restrições a uma classe-base virtual

8.2.6.4 Exemplo de classe-base virtual

9. Polimorfismo através de métodos virtuais

9.1 Ligação estática

9.2 Ligação dinâmica

9.3 Métodos virtuais ou funções-membro virtuais

9.3.1 Sintaxe de um método virtual

9.3.2 Restrições a métodos virtuais

9.3.3 Exemplo de utilização de método virtual

9.3.4 Métodos virtuais puros a partir de classes abstratas

9.3.4.1 Sintaxe de método virtual puro

9.3.4.2 Exemplo de utilização de método virtual puro

9.3.5 Métodos destrutores virtuais

10. Fluxos de entrada e saída em C++

10.1 Local de definição da hierarquia de fluxos

10.2 Hierarquia das classes de entrada/saída

10.3 Descrição de classes stream de maior relevância

10.3.1 Classe ios

10.3.2 Classe istream

10.3.3 Exemplos de utilização das classes ios e istream

10.3.4 Classe ostream

10.3.5 Exemplos de utilização das classes ios e ostream

10.3.5.1 Ajustando e preenchendo campos de exibição

10.3.5.2 Exibindo um número em notação científica

10.3.5.3 Exibindo os formatos ASCII de um número

10.3.5.4 Exibindo o valor ASCII decimal de uma letra

10.3.6 Formatando o fluxo de saída com a iomanip.h

10.3.6.1 Exemplos de formatações utilizando funções de iomanip.h

10.3.6.1.1 Ajustando e preenchendo campos de exibição

10.3.6.1.2 Definindo a precisão das casas decimais

10.4 Sobrecarregando '<<' e '>>' com classes próprias

10.5 Entrada e saída de dados em arquivos

10.5.1 Gravando dados com objetos ofstream

10.5.1.1 Exemplos de gravação de dados com objetos ofstream

10.5.1.1.1 Criando um arquivo no modo default e gravando dados

10.5.1.1.2 Acrescentando dados a um arquivo

10.5.1.2 Fechamento de arquivo

10.5.2 Lendo dados com objetos ifstream

10.5.2.1 Exemplo de leitura de dados de arquivo com ifstream

10.5.3 Inicializando e fechando arquivos com métodos de fstream

10.5.3.1 Exemplo de criação de objeto com fstream

10.5.4 Quantidade de maneiras na abertura de arquivos

10.5.5 Saída de dados de objetos em arquivos

10.5.6 Entrada de dados de objetos a partir de um arquivo

10.5.7 Utilizando write() para gravar saída de dados de objetos

10.5.8 Utilizando read() para ler dados de objetos

10.5.9 Pesquisa em arquivos

11. Templates 7

11.1 Funções templates

11.1.1 Sintaxe de função template

11.1.2 Exemplos de função template

11.1.3 Conversão de tipo com função template

11.1.4 Compilador gera uma cópia da função para cada tipo

11.1.4.1 Comprovando a cópia com a utilização de variável estática

11.2 Classes templates

11.2.1 Sintaxe de classe template

11.2.2 Exemplos de classe template

Apêndice A

Quais compiladores podem ser utilizados?

Exercícios propostos

Como receber os exercícios resolvidos via BBS da Lísias

O suporte gratuito pelo webSite da Lísias

Uma oportunidade para você com a Lísias

BIBLIOGRAFIA

íNDICE REMISSIVO