INSTRUTOR SCOPINO AULAS UMEC 2005 INSTRUTOR: SCOPINO AULA 8.
+ Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima
Transcript of + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima
![Page 1: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/1.jpg)
+
Curso de C/C++
Aula 9
Instrutor: Francisco Magalhães
Material por: Allan Lima
http://allanlima.wordpress.com/
![Page 2: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/2.jpg)
Você pode: copiar, distribuir, exibir e executar a obra criar obras derivadas fazer uso comercial da obra
Sob as seguintes condições: Atribuição. Você deve dar crédito ao autor original, da forma
especificada pelo autor ou licenciante. Compartilhamento pela mesma Licença. Se você alterar, transformar, ou
criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta.
Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra.
Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor.
Veja aqui a licença completa
![Page 3: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/3.jpg)
+Roteiro
Namespaces
Exceções
Casts
O operador typeid
Entrada e Saída
![Page 4: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/4.jpg)
+namespaces
Um namespace é um mecanismo para expressar um agrupamento lógico
Sintaxe:
namespace nomeDoNamespace {corpoDoNamespace
}
![Page 5: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/5.jpg)
+namespaces
Podemos utilizar um namespace para agrupar diversas funções, classes, variáveis ....
Por exemplo, se tivermos muitas funções para realização de operações matemáticas podemos criar um namespace para todas
![Page 6: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/6.jpg)
+Exemplo
exemploNamespace.h
![Page 7: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/7.jpg)
+namespaces
Podemos acessar os membros de um namespace de duas maneiras diferentes:
Usando o operador ::Através do comando using namespace
![Page 8: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/8.jpg)
+Exemplo
#include <iostream>
#include "exemploNamespace.h"
using namespace Mat;
int main() {
std::cout << maximo(10, 56) << std::endl;
std::cout << minimo(10, 56) << std::endl;
std::cout << PI << std::endl;
NumeroComplexo c;
BigInteger b;
return 0;
}
![Page 9: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/9.jpg)
+namespaces
namespaces podem ser utilizados quando tivermos mais de uma função com o mesmo protótipo.
Exemplo:
exemploNamespaceFuncoes.cpp
![Page 10: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/10.jpg)
+Exceções
Como podemos descobrir quando um erro ocorre no nosso programa?
Podemos utilizar o conceito de exceção
Exceções são erros que ocorrem em tempo de execução
Lançando uma exceção:
throw nomeDaExceção;
![Page 11: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/11.jpg)
+Exceções
Tratando uma exceção:
try {// comandos
} catch (TipoDaExceção) { // código executado quando ocorre uma exceção}
Obs.: Com o comando throw podemos lançar qualquer coisa. E com o catch podemos tratar qualquer coisa que foi lançada.
![Page 12: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/12.jpg)
+Exceções
C++ permite o uso de try-catch’s aninhados
Também permite o uso de vários catch’s para um único try
Quando queremos tratar uma exceção qualquer podemos fazer catch (...)
![Page 13: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/13.jpg)
+Exemplos
exemploExcecoes1.cpp
exemploExcecoes2.cpp
![Page 14: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/14.jpg)
+Exceções
A biblioteca padrão de C++ contém um conjunto de exceções predefinido
Estas exceções herdam da classe std::exception que foi definida no header <exception>
![Page 15: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/15.jpg)
+Exceções
Exceções da Biblioteca Padrão de C++
![Page 16: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/16.jpg)
+Exemploclass A {
virtual void a() {};
};
int main() {
try {
A *a = NULL;
typeid(*a);
} catch (std::exception &e) {
cout << e.what() << endl;
}
return 0;
}
![Page 17: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/17.jpg)
+Exercícios
1) Crie um namespace chamado banco e dentro dele declare uma classe chamada Conta com os atributos saldo e número com os seguintes métodos:
void debitar(float valor); void creditar(float valor);
Crie também uma exceção chamada SaldoInsuficienteException que será lançada pelo método debitar.
![Page 18: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/18.jpg)
+Cast
O operador de cast tradicional pode ser aplicado de forma indiscriminada para fazer conversões entre tipos
Exemplo:
exemploCast.cpp
![Page 19: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/19.jpg)
+Cast
Em C++ o cast no estilo antigo é obsoleto (deprecated)
Em compensação C++ possui novos operadores de cast:
static_cast <novoTipo> (expressão) const_cast <novoTipo> (expressão) reinterpret_cast <novoTipo> (expressão) dynamic_cast <novoTipo> (expressão)
Com eles podemos obter os mesmos resultados do estilo antigo, porém de forma mais segura
![Page 20: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/20.jpg)
+static_cast
Realiza casts mais seguros e portáveis em comparação com o método antigo.
Verifica se algumas conversões de tipos são compatíveis
Pode ser utilizado para realizar conversões entre ponteiros e tipos básicos
Exemplo:
exemploStaticCast.cpp
![Page 21: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/21.jpg)
+const_cast
Utilizado para as conversões:
Constante VariávelVariável volátil Variável não volátil
Exemplo:
exemploConstCast.cpp
![Page 22: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/22.jpg)
+reinterpret_cast
Utilizado para as conversões:
Ponteiro PonteiroInteiro Ponteiro
Não faz qualquer verificação de tipo
É o mais perigoso dos operadores de cast
Exemplo:
exemploReinterpretCast.cpp
![Page 23: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/23.jpg)
+dynamic_cast
Utilizado para a conversão entre ponteiros e referências para objetos
Verifica se a operação é válida em tempo de execução.
Se não for retorna NULL Exemplo:
exemploDynamicCast.cpp
![Page 24: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/24.jpg)
+Violando o encapsulamento
Podemos usar o reinterpret_cast para violar o encapsulamento dos atributos de uma classe
É só criar uma classe com os mesmos atributos da classe original, mas com o modificador de acesso public
Exemplo:
exemploEncapsulamento.cpp
![Page 25: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/25.jpg)
+typeid
É utilizado para saber informações sobre os tipos
Sintaxe:
type_info typeid(variavel);
A classe type_info possui o método name() que retorna o nome do tipo
A classe type_info também sobrecarrega os operadores == e !=
Para poder utilizar a classe type_info precisamos incluir o header <typeinfo>
![Page 26: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/26.jpg)
+Exemplo
exemploTypeid.cpp
![Page 27: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/27.jpg)
+E/S Padrão
C++ possui uma biblioteca de E/S chamada iostream
Esta possui alguns dispositivos predefinidos:
Nome Tipo Buffered Descrição
cin istream Sim Entrada padrão (normalmente o teclado)
cout ostream Sim Saída Padrão (normalmente o monitor)
clog ostream Sim Saída de erro padrão (normalmente o monitor)
cerr ostream Não Saída de erro padrão (normalmente o monitor)
![Page 28: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/28.jpg)
+O tipo ostream
É um tipo de saída de dados
Podemos enviar dados para objetos deste tipo através do operador << (operador de inserção)
O operador << pode ser utilizado mais de uma vez na mesma sentença e não adiciona um ‘\n’ no final da linha
Exemplos:
cout << “UFPE\n”;//endl = a quebra de linhacerr << “CIn” << endl;clog << “C++” << “\n”;
![Page 29: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/29.jpg)
+O tipo istream
É um tipo de entrada de dados
Podemos ler dados de objetos deste tipo através do operador >>
O operador >> também pode ser utilizado mais de uma vez na mesma sentença
A leitura só é realizada até um ‘\r’, ‘\n’ ou ‘ ’
Exemplo:
int a;float b;cin >> a >> b;
![Page 30: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/30.jpg)
+E/S com Arquivos
Principais classes:
ifstream – Utilizada para leitura de dados de arquivos
ofstream – Utilizada para gravação de dados de arquivos
fstream – Utilizada para ambos leitura e gravação de dados de arquivos
Para utilizar esta classe devemos incluir o arquivo fstream.h
![Page 31: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/31.jpg)
+E/S com Arquivos
Abrindo um arquivo: void open(const char *nomeArquivo,
openMode modo);
Exemplo:fstream myStream();myStream.open(“meuArquivo”, ios::in);
Fechando um arquivo: void close(); Exemplo:
myStream.close(); Este método é chamado no destrutor das classes ifstream, ofsteam e fstream
![Page 32: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/32.jpg)
+E/S com Arquivos
Modos de Abertura:
Modo Descrição
ios::in Abre um arquivo para leitura
ios::out Abre um arquivo para escrita
ios::app Abre um arquivo apenas para adicionar dados ao seu final
ios::ate Abre um arquivo existente e move o cursor para o final do arquivo
ios::trunc Se o arquivo existir ele será sobrescrito
ios::binary Abre o arquivo em modo binário
Os modos acima podem ser combinadas com o operador ‘|’
![Page 33: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/33.jpg)
+E/S com Arquivos
Modos de abertura padrão das classes:
Classe Modo
ofstream ios::out | ios::trunc
ifstream ios::in
fstream ios::in | ios::out
![Page 34: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/34.jpg)
+E/S com Arquivos
Podemos abrir um arquivo sem usar o método open:ofstream arq(“meuAquivo”, ios::out|ios::app);
Método is_open() indica se o arquivo esta aberto
Método eof() indica se o arquivo chegou ao seu fim
Função getline()Lê uma linha do arquivo
![Page 35: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/35.jpg)
+E/S com Arquivos
Podemos utilizar os operadores >> e << para ler e escrever em arquivos respectivamente
Para manipulação de arquivos binários existem os métodos:
void write(char *buffer,
streamsize tamanho);
void read(char *buffer,
streamsize tamanho);
![Page 36: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/36.jpg)
+Exemplo
exemploArquivo.cpp
![Page 37: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/37.jpg)
+Exercícios
2) Crie um programa que abre e conta o número de caracteres de um arquivo de texto, este número deverá ser mostrado na tela. Além disso, o usuário deverá entrar com o caminho do arquivo e se este não existir uma exceção deverá ser lançada.
3) Crie um programa chamado mycopy que recebe como argumento, na sua função main, dois caminhos para arquivos de texto e copia todo o conteúdo do primeiro para segundo. O programa também deverá imprimir no monitor o número total de linhas copiadas.
![Page 38: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/38.jpg)
+Referências
Stroustrup, Bjarne. The C++ Programming Language, Special Edition
Eckel, Bruce. Thinking in C++, 2nd ed. Volume 1
TechZone
http://www.nexsun.com.br/techzone.html Slides de Gustavo ([email protected]) do curso de C/C++
![Page 39: + Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima](https://reader035.fdocumentos.com/reader035/viewer/2022062700/552fc142497959413d8df7b9/html5/thumbnails/39.jpg)
+Agradecimentos
Allan Lima e Breno do Vale
Pelo material cedido para o curso