1 / 39

Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima

Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima http://allanlima.wordpress.com/. Você pode: copiar, distribuir, exibir e executar a obra criar obras derivadas fazer uso comercial da obra Sob as seguintes condições:

ash
Download Presentation

Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Curso de C/C++ Aula 9 Instrutor: Francisco Magalhães Material por: Allan Lima http://allanlima.wordpress.com/

  2. 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

  3. Roteiro • Namespaces • Exceções • Casts • O operador typeid • Entrada e Saída

  4. namespaces • Um namespace é um mecanismo para expressar um agrupamento lógico • Sintaxe: namespace nomeDoNamespace { corpoDoNamespace }

  5. 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

  6. Exemplo • exemploNamespace.h

  7. namespaces • Podemos acessar os membros de um namespace de duas maneiras diferentes: • Usando o operador :: • Através do comando using namespace

  8. 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; return0; }

  9. namespaces • namespaces podem ser utilizados quando tivermos mais de uma função com o mesmo protótipo. • Exemplo: • exemploNamespaceFuncoes.cpp

  10. 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;

  11. 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.

  12. 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 (...)

  13. Exemplos • exemploExcecoes1.cpp • exemploExcecoes2.cpp

  14. 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>

  15. Exceções Exceções da Biblioteca Padrão de C++

  16. Exemplo class A { virtualvoid a() {}; }; int main() { try { A *a = NULL; typeid(*a); } catch (std::exception &e) { cout << e.what() << endl; } return0; }

  17. Exercícios • Crie um namespace chamado banco e dentro dele declare uma classe chamada Conta com os atributos saldo e númerocom 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.

  18. Cast • O operador de cast tradicional pode ser aplicado de forma indiscriminada para fazer conversões entre tipos • Exemplo: • exemploCast.cpp

  19. 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

  20. 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

  21. const_cast • Utilizado para as conversões: • Constante  Variável • Variável volátil  Variável não volátil • Exemplo: • exemploConstCast.cpp

  22. reinterpret_cast • Utilizado para as conversões: • Ponteiro  Ponteiro • Inteiro  Ponteiro • Não faz qualquer verificação de tipo • É o mais perigoso dos operadores de cast • Exemplo: • exemploReinterpretCast.cpp

  23. 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

  24. Violando o encapsulamento • Podemos usar o reinterpret_castpara 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

  25. 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_infoprecisamos incluir o header <typeinfo>

  26. Exemplo • exemploTypeid.cpp

  27. E/S Padrão • C++ possui uma biblioteca de E/S chamada iostream • Esta possui alguns dispositivos predefinidos:

  28. 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 linha cerr << “CIn” << endl; clog << “C++” << “\n”;

  29. 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;

  30. 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

  31. 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

  32. E/S com Arquivos • Modos de Abertura: Os modos acima podem ser combinadas com o operador ‘|’

  33. E/S com Arquivos • Modos de abertura padrão das classes:

  34. 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

  35. 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);

  36. Exemplo • exemploArquivo.cpp

  37. Exercícios • 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. • 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.

  38. 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 (ghcp@cin.ufpe.br) do curso de C/C++

  39. Agradecimentos • Allan Lima e Breno do Vale • Pelo material cedido para o curso

More Related