Programar Em C++ Wikibooks

  • Published on
    25-Nov-2015

  • View
    31

  • Download
    4

Transcript

  • PDF gerado usando o pacote de ferramentas em cdigo aberto mwlib. Veja http://code.pediapress.com/ para mais informaes.PDF generated at: Sun, 30 Mar 2014 20:34:50 UTC

    Programar em C++

  • ContedoPginas

    Objetivo 1Por que C++? 1Diferenas entre C e C++ 2Introduo 3Al, Mundo! 6Variveis e constantes 12Ponteiros 18Vetores 20Estruturas 29Operadores 34Deciso e controle de fluxo 37Estruturas de repetio 42Funes 49Referncias de dados 51Entrada e sada de dados 56Entrada e sada de dados 2 65Manipulando strings 80Classes 88Encapsulamento 103Herana 106Polimorfismo 119Friend 124Classes internas 126Sobrecarga de operadores 127Alocao dinmica de memria 129Excees 136Namespace 136Templates 136Containers 138Compilao 138Lista de Palavras Reservadas do C++ 140Lista de Sequncias de Escape 141Tabela ASCII 142C++11 143

  • RefernciasFontes e Editores da Pgina 144Fontes, Licenas e Editores da Imagem 145

    Licenas das pginasLicena 146

  • Objetivo 1

    ObjetivoO livro Programar em C++ tem por objetivo apresentar os fundamentos desta linguagem, de modo que o estudantepossa desenvolver diferentes tipos de softwares em alto e baixo nvel para os diversos ambientes existentes, desdeaplicaes para GNU/Linux ou Windows at programas para microcontroladores, alm de fornecer a base para osestudos avanados de C++.Por ser um livro especfico sobre a linguagem C++, altamente recomendvel que o leitor tenha conhecimentosprvios sobre a linguagem C.Espera-se que este livro aborde: Aspectos tericos Aspectos prticos Os erros comunsPara tanto cada tpico dever ter uma explicao terica, citar os erros mais comuns e exerccios.

    Por que C++?Imagine que voc deve fazer um programa para fazer a mquina de um pequeno relgio de pulso funcionar, entovoc pensa: Bom, isso pode ser feito com Assembly... Porm, pensando melhor, voc decide mudar de linguagem quando voc pondera. O problema maior que se eu tiver que mudar o processador do relgio, vou ter que refazer o programa. melhor

    usar linguagem "C". Depois voc termina por avaliar outra possibilidade: Bem, se eu j estou pensando em "C" melhor usar "C++", depois vai ser mais fcil de entender o cdigo,

    reaproveitar em outras coisas e ainda vai ser mais fcil de expandir para outros modelos de relgio.E assim o que podemos perceber como C++ poderosa, flexvel e abrangente. Ela pode ser usada para programarqualquer tipo de hardware, desde os mais simples at os mais complexos. Alm disso, C++ uma linguagem quegera programas em cdigo de mquina, que funcionam com ou sem a participao de sistemas operacionais nodispositivo.Alguns profissionais afirmam que C++ a linguagem mais poderosa que existe, veja algumas caractersticas dela: um superconjunto da linguagem C, e contm vrios melhoramentos; Deu origem a grandes linguagens como Java e D; a porta para a programao orientada a objetos; C++ pode virtualmente ser efetivamente aplicado a qualquer tarefa de programao; H vrios compiladores para diversas plataformas tornando a linguagem uma opo para programas

    multiplataforma.A linguagem C++ utilizada em projetos como: Compiladores; Editores; Ferramentas de programao; Jogos; Programas de redes.At ao momento foram realizadas 3 grandes revises linguagem:

  • Por que C++? 2

    1 em 1985; 2 em 1990; 3 em 1998 a que deu origem ao ANSI \ ISO standard a que ficou comummente denominada de Standard C++.

    Esta verso suportada por todos os compiladores C++ famosos incluindo Microsofts Visual C++, BorlandsC++ Builder e GCC. Esta foi revista em 2003.

    C++ considerada uma linguagem que est entre linguagem de alto nvel (em ingls, high level language) elinguagem de baixo nvel (em ingls, low level language). Dito de outra forma, uma linguagem que est prximada linguagem humana (linguagem de alto nvel), mas ao mesmo tempo permite estar prximo da maneira como ocomputador processa, prximo do Assembly (uma linguagem de baixo nvel).

    Diferenas entre C e C++Quem sabe programar em C++, capaz de programar C, devido semelhana entre as linguagens e o fato do C++ser uma extenso do C. Contudo o C no completamente um subconjunto do C++. Grande parte de cdigo C podeser perfeitamente compilado em C++, mas existem algumas pequenas diferenas sintticas e semnticas entre aslinguagens que tornam alguns trechos de cdigo C vlidos em cdigo C++ invlido, ou cdigos que exibemcomportamentos diferentes em cada linguagem.Algumas diferenas bsicas: O C permite a converso implcita entre o tipo de dado void* para ponteiros para outros tipos, algo que o C++ no

    permite. O C permite que constantes de caracteres sejam inseridas em chamadas de funes com parmetros tipo char*,

    em C++ preciso declarar o parmetro como const char *;Alm destas pequenas diferenas, C++ tem um conjunto de caractersticas que a torna fundamentalmente diferentede "C". Esse conjunto, torna possvel programar em C++ de um modo totalmente diferente do modo de programar dalinguagem "C". O que traz a diferena o modo da orientao na montagem do cdigo.Chamamos o modo de programar em "C" de orientado a procedimentos e chamamos o modo do "C++" de orientadoa objetos. Muitas pessoas confundem as coisas quando comeam a programar usando um compilador C++, pois estalinguagem permite programar nos dois modos. Essa uma das caractersticas que a torna mais flexvel.Apesar de C++ permitir programar em modo orientado a procedimentos, podemos dizer que nestes casos estamosprogramando em "C", usando um compilador C++. Quando usamos C++ programamos em modo orientado aobjetos. Devido a estas caractersticas, o C++ permite programar em modo misto, ou seja, escrevendo partes docdigo orientadas a procedimentos e outras orientadas a objetos.As diferenas entre os dois modos de programar sero esclarecidas nos captulos subsequentes. Por hora nos bastadeixar claro que os dois modos so diferentes. Usar estes dois modos de programar ao mesmo tempo uma dasfacilidades que o C++ permite, enquanto que outras linguagens orientadas a objetos como Java, Eifel, etc, nopermitem.

    Esta pgina um esboo de informtica. Ampliando-a voc ajudar a melhorar o Wikilivros.

  • Introduo 3

    Introduo

    Pensando no cdigoConsiderando o conjunto de operaes e eventos que nosso programa deve executar temos diversas maneiras de criaro cdigo, porm o mais difcil criar um cdigo eficiente, rpido e compacto. Na verdade, diversos fatores podeminterferir nestes aspectos da programao, entre eles, a escolha do compilador, o mtodo de estruturar o cdigo, aorientao do mesmo, etc... Em termos gerais, um cdigo torna-se mais prximo do ideal a medida que suas partestornam-se mais simples de se analisar e quando todos os processos esto bem definidos e especializados. Quandotemos um cdigo que contm muito mais excees do que regras, este precisa de uma reestruturao.Podemos definir C++ como um "superconjunto" da linguagem C, ou seja, uma linguagem com mais funcionalidadesque a linguagem C. Embora este seja o ponto de vista de quem j tem um conhecimento da linguagem C, ela muitomais que isto. Podemos mudar completamente a forma de criar o programa quando usamos os recursos avanados dalinguagem, as estruturas de deciso (por exemplo, if-else ou switch) podem ser simplificadas e a organizaodo cdigo pode ser bem mais globalizada e genrica, possibilitando a reutilizao do cdigo em diversas situaesdiferentes.Vejamos como as funcionalidades da linguagem C++ podem ajudar a redefinir os meios de programao queaprendemos com o bom e velho estilo C.

    Dois modos de programarObservando o modo de programar que as linguagens oferecem desde os primrdios da computao, podemos notarvrios mtodos que foram sendo superados e outros que se estabelecem por um momento. O modo de programarmais usual e bem mais difundido conhecido como modelo estruturado sequencial. Em sntese, refere-se a formade programar onde uma instruo segue a outra numa sequncia que inicia e termina em um fluxo parcialmente"previsvel".A programao estruturada ainda pode ser classificada em dois modos: um orientado a procedimentos e outroorientado a objetos. Os dois podem ser confundidos por quem no tem muita experincia, mas o uso de um ou dooutro implica em caractersticas prprias para cada caso. Logo, preciso entender bem os conceitos antes de definirse um cdigo procedural ou orientado a objetos.O modelo sequenciado procedural bem simples de implementar, porm, aumenta a complexidade para tarefas maisbem trabalhadas e sofisticadas. Isto ocorre devido a estrutura do modelo, que exige rotinas cada vez mais extensas.No raramente possvel encontrar rotinas que, em alguns casos, tornam-se comparveis a programas completos,usando como referncia o nmero de linhas de instrues. O uso deste modelo, muitas vezes dificulta a manutenoe expanso do cdigo, caso isto no seja feito de maneira muito bem organizada.O segundo modelo o orientado a objetos. O que significa isso e o que muda no modo de programar, caso oadotemos em vez do modelo anterior?A orientao define o modo de abordar o problema para tentar solucion-lo: O modelo de orientao a procedimentos se preocupa em fornecer meios para resolver o problema sem

    contabilizar, a princpio, os dados que sero usados durante o processo. O modelo de orientao a objetos se preocupa com os elementos que so necessrios para a soluo de um

    problema. Sob este ngulo, os dados so os elementos principais na anlise do problema.Este livro traz uma viso dos problemas sob a ptica da orientao a objetos, enquanto que o livro "Programar em C" traz a anlise sob a ptica da orientao a procedimentos. Isto no quer dizer que devamos escolher a orientao a objetos como o modo mandatrio de programao, mas que podemos contar com seus recursos sempre que esta escolha facilite a resoluo do problema. Portanto, cabe sempre uma anlise para definir se o problema melhor

  • Introduo 4

    tratado por uma abordagem orientada a objetos ou a procedimentos.

    Um pouco sobre orientao a objetosA programao orientada a objetos um paradigma de programao que visa organizao, produtividade esustentabilidade.A apresentao dos conceitos de orientao a objetos bastante abrangente, o que implica na abordagem de diversosaspectos, como modelagem, estudo de performance de modelos, aplicabilidade de tcnicas, estruturao de objetos,otimizao, manuteno do cdigo, entre outros. Por este motivo, nosso objetivo aqui no apresentar a orientao aobjetos em sua totalidade. Para um estudo mais detalhado do tema sugerimos o livro POO, que trata especificamentedeste tema. O objetivo aqui apresentar como a orientao a objetos se aplica na linguagem C++, porm osconceitos aqui apresentados devem ser suficientes para a estruturao de programas de bom nvel.A ideia principal por traz do modelo de programao orientado a objetos est em transformar entidades do mundoreal em identificadores dentro do programa (objetos), trabalhando-os como entidades da linguagem que possuemcaractersticas e operaes prprias. Esta abordagem transforma o programa em um meio de simulao de situaesvirtuais por meio de entidades de cdigo que tem comportamento predefinido. Esta abstrao uma aliada doprogramador por permitir idealizar sistemas mais sofisticados de uma maneira bastante intuitiva.Todas as linguagens orientadas a objetos contm os princpios de: Encapsulamento

    um mecanismo para esconder os detalhes envolvidos no processamento de uma ao. Por exemplo, quandousamos um telefone, no precisamos lidar diretamente com o circuito interno; a interface do telefone cuidadesse problema.

    PolimorfismoIsso permite o uso de uma nica interface uma nica forma de uso para objetos de tipos diferentes; emparticular, a mesma interface para objetos de uma classe e objetos de classes derivadas dessa.

    HeranaComo o nome sugere, isso permite que uma classe herde de outra suas caractersticas, podendo tambmintroduzir suas prprias ou alterar as caractersticas herdadas. O uso de herana acaba poupando trabalho emelhorando a organizao do cdigo.

    Paradigmas da Programao:Desde o incio da programao, j passamos pelos seguintes paradigmas: No estruturada - exemplos: COBOL, FORTRAN, BASIC (anos 50-60) Procedimental ou Procedural - exemplos: C, Pascal (anos 70) Modular - exemplo: Modula II (anos 80) Abstrao de tipos de dados - exemplo: Ada (anos 80) Programao Orientada a Objetos - exemplos: C++, Java, Delphi (Object Pascal) entre outras. (dcadas

    80-90-2000)

  • Introduo 5

    ObjetosObjeto , genericamente, uma entidade de armazenamento e manipulao de dados. O mesmo deve ser criado paraprocessar os dados que armazena e recebe, sendo sensvel a entradas do programa principal para fornecer as sadasesperadas pelo mesmo. Por estes motivos o objeto deve ser pensado como uma entidade de dados autnoma,encarregada de processar todos os dados que mantm.Da mesma forma que podemos usar tipos de dados nativos da linguagem podemos criar nossos tipos de dados. Nalinguagem C podemos criar tipos de dados compostos que chamamos de estruturas, estes so criados com a palavrachave struct. C++ possibilita o uso de estruturas de dados e introduz um novo tipo chamado de classe. Como onome sugere, uma classe refere-se a um conjunto de caractersticas dadas a um grupo de "indivduos", ou seja, grupode objetos. Por este motivo, classe a definio de tipo de objeto.Em C++ as classes de objetos so criadas atravs da palavra chave class. Esta nomenclatura usada por muitasoutras linguagens de programao mais caracteristicamente restritas a orientao a objetos. Estes aspectos facilitamum pouco o aprendizado por programadores j familiarizados com estas linguagens quando iniciam a programaoem C++.O processo de criao de um objeto segue a sequncia: Definir os dados e procedimentos que a classe deve conter; Criar a classe de objetos; Declarar (instanciar) o objeto.A definio de uma classe de objetos deve ser feita de forma a tornar, preferencialmente, todos os dados protegidosde interferncias de cdigos externos ao objeto. Por este motivo um objeto deve ser uma parte do cdigo doprograma com uma certa autonomia. Este deve ter controle sobre seus dados e ser capaz de prov-los e lidar comeventos a eles relacionados. Dentro de seu escopo de responsabilidades, a entidade deve essencialmente "ter vidaprpria".

  • Al, Mundo! 6

    Al, Mundo!

    Ol mundo! comum, no aprendizado de uma linguagem de programao, que seu primeiro programa faa com que ocomputador exiba "Ol mundo!". Na linguagem C++ este primeiro programa j introduz muitos conceitos sobre alinguagem. Veja o cdigo do nosso primeiro programa:

    #include

    using namespace std;

    int main ()

    {

    cout

  • Al, Mundo! 7

    #endif

    Em sistemas parecidos com UNIX, como GNU/Linux ou FreeBSD, pode-se usar um terminal de linha de comandofacilmente, pois os mesmos possuem o recurso facilmente acessvel, mesmo quando o usurio est usando a interfacegrfica. Por isso, para esses sistemas um comando para solicitar pausa ao sistema no necessrio.

    Entrada de dados e comentrios no cdigoComentrio um recurso muito til em programao. Ele permite que o programador adicione texto ao programapara facilitar o entendimento do programa por parte de outros programadores, ou at dele mesmo. Os comentriosso usados para explicar trechos de cdigo, adicionar clusulas e qualquer texto em geral.Vamos agora para um programa mais completo com entrada de dados e comentrios dentro do cdigo:

    // Este um comentrio de uma linha

    /*

    Este

    um comentrio

    de vrias

    linhas

    */

    #include

    using namespace std;

    int main ()

    {

    int x;

    cout > x;

    cout

  • Al, Mundo! 8

    Ao analisar o cdigo, o preprocessador encontra a sequncia // e vai eliminar o texto que est a seguir at ao fimda linha.Mais uma forma de adicionar comentrios:

    /*

    Este

    um comentrio

    de vrias

    linhas

    */

    A linguagem C++ permite tambm fazer comentrios por mais do que uma linha. Chama-se comentrio por bloco eo que faz eliminar tudo o que encontrar entre a sequncia inicial /* e o final */.A vantagem de termos esta possibilidade poder comentar o nosso cdigo. Existem algumas regras de boa condutapara comentrios que foram criadas por pessoas que j tm muito tempo nisto: Uma criar logo no topo um comentrio a dizer o que o nosso programa, e o que faz numa forma geral; Outra fazer comentrios a cada funo que aparece no cdigo a explicar; Outra comentar uma linha mais obscura, mais difcil de entender, que no bvia; A outra no comentar tudo. O comentar deve ser para sobressair.Esta ltima regra pode ser esquecida quando o programa didtico, neste caso pode-se usar o programa como textocomentado.

    Incluindo cabealhos#include

    O smbolo # uma chamada de ateno ao compilador a dizer que aquela linha para o preprocessador, depoistemos o "include" (que basicamente diz para incluir cdigo). Incluir o qu?Deve incluir o ficheiro/arquivo iostream. (in+out+stream, "fluxo de entrada e sada", padro) (na maioria dasvezes, como entrada padro temos o teclado e como sada temos o monitor) (este ficheiro/arquivo contmdeclaraes das funes e definies que o nosso cdigo fonte ir necessitar)Este cdigo que ser includo chamado de cabealho devido a uma caracterstica evidente, o fato de ser cdigo dedeclarao inicial do programa, que deve estar no topo do arquivo/ficheiro.Existem outros arquivos (ficheiros cabealho), o iostream para fluxos de entrada e sada, mas temos muitosmais para matemtica, manipulao de tempo, tratamento de caracteres, etc...Na maioria das vezes, os arquivos de cabealho fazem parte de uma biblioteca. Podemos ver na parte dos anexos,algumas bibliotecas que existem juntamente com as funes de cada uma. Ns prprios podemos criar umabiblioteca com cdigo e nosso prprio cabealho. E at podemos comprar bibliotecas existentes comercialmente,atravs de empresas especializadas em desenvolvimento, que tambm tero seus arquivos/ficheiros de cabealhos.Mas, o que so bibliotecas? So arquivos com um conjunto de cdigos que algum fez antes. As que enunciamosantes so as "standard", so aquelas que tm as funcionalidades bsicas, pertencentes aos padres da linguagem.Repare-se que precisamos da biblioteca at para escrever (no ecr)/(na tela) (stream + out) que nos permite utilizar ocout.O ficheiro/arquivo iostream est envolvido em < >, isto significa que o preprocessador deve procurar oficheiro/arquivo no stio/diretrio usual (que onde o compilador usa como padro para os "includes"). Setivssemos o ficheiro/arquivo iostream envolvido em "" significaria que o preprocessador deveria procur-lodentro de uma lista de diretrios de incluso, "includes", iniciando pelo diretrio atual.

  • Al, Mundo! 9

    As bibliotecas so compostas por 2 partes: um ndice de todas as funes e definies e declaraes, o cabealho, edepois a definio de todas as funes existentes no ndice, arquivos de cdigo.As diretivas de preprocessamento no terminam com o ponto e vrgula como nas instrues.

    Namespaceusing namespace std;

    Observando esta linha, alguns tradicionais programadores em linguagem C, tm uma novidade: namespaces soespaos de nomes dentro do cdigo, eles funcionam, entre outras coisas, como um meio de evitar duplicao denomes dentro de um projeto extenso, que geralmente contam com inmeros arquivos.O C++ usa os namespaces para organizar os diferentes nomes usados nos programas. Cada nome usado noficheiro/arquivo biblioteca "standard iostream" faz parte do "namespace" chamado de std.O objeto de sada padro, cout, est definido dentro do "namespace" std, ele um objeto da classe "ostream" "outputstream", para acess-lo temos que referenci-lo como "std::cout". Para evitar que tenhamos que informar "std::"todas as vezes que precisarmos usar os recursos deste "namespace", podemos informar que estamos usando-o dentrodo arquivo atual, conforme vemos na linha declarada no incio deste tpico.O "namespace" permite que as variveis sejam localizadas em certas regies do cdigo. Declarar o "namespace std"permite que todos os objetos e funes da biblioteca "standard input-output" possam ser usados sem qualquerqualificaes especficas, desta maneira, no mais necessrio o uso de "std::".Este um conceito avanado que podemos explorar mais, vamos deix-lo para depois.

    Funo "main"int main(){}

    Como na linguagem C, a funo principal de entrada do programa a partir do sistema operacional a funo main.Por isso mesmo ela obrigatria em qualquer programa. Se no existisse uma "main function", no haveria entradapara que o sistema iniciasse o programa.Todas as funes so declaradas e usadas com o operador ( ), assim que o compilador reconhece que estas sofunes. A ideia de ter funes permitir o encapsulamento de uma ideia ou operao, dar um nome a isso e depoischamar essa operao de vrias partes do programa simplesmente usando o seu nome. As funes declaradas comomembros de uma classe de objetos podem ser chamadas de mtodos.Do ponto de vista funcional, um cdigo dentro de uma funo executa operaes em outra parte do programa, queno aquela de onde foi chamada, por este motivo as mesmas contam com um mecanismo de passagem de dados, aodeclarar uma funo indicamos quais os dados que entram e o que ela deve fornecer a quem lhe chamou. Pode-sedizer que, tal qual uma funo matemtica, a funo em C/C++ poder ser substituda, depois de sua execuo, pelovalor que ela retorna, este valor ser especificado antes do nome da funo na declarao da mesma, conformevemos no incio deste tpico.O int significa que a funo vai retornar um inteiro. Existem outros tipos de dados como, por exemplo, os seguintes: int que a abreviatura de inteiro; char que a abreviatura de caratere; float que a abreviatura de "floating point number", ou seja, uma representao para nmero real.Vejamos um exemplo:Quando criamos uma funo soma, obviamente s para ilustrao pois isso no necessrio, podemos fazer:

    int soma(int a, int b)

    { return a + b;

    }

  • Al, Mundo! 10

    Agora imagine que tenhamos que somar 2 e 3, colocando o resultado em outra varivel chamada valor, para istofaremos:

    valor = soma(2, 3);

    Primeiro analisamos qual o resultado e depois substitumos a funo pelo valor que ela retorna:

    valor = 5;

    Simples, no?; - Final de sequncia de instrues

    O ponto e vrgula funciona como ponto final, separa as instrues e contextos. Repare que apenas as funes, oumelhor, as definies de funes e as diretivas de preprocessamento que no tm o ";" importante notar que o cdigo poderia ser todo escrito quase numa linha tipo:

    int main (){int a; cout > a;cout

  • Al, Mundo! 11

    O que esta linha faz colocar o valor que foi digitado numa rea de memria que foi chamada de "a".Da mesma forma que o cout existe para sada de dados, temos outro objeto para entrada atravs do teclado, esteobjeto chamado de Console IN - cin, seguindo a mesma analogia. Observe que o operador >> usado para darideia de que os dados esto vindo do cin para a varivel "a".

    cout

  • Variveis e constantes 12

    Variveis e constantes

    ConstantesCompatvel com a linguagem C, o C++ mantm as constantes bsicas e introduz algumas novas funcionalidadespossibilitadas pelo modificador const.O uso do modificador const tem duas funes principais:1.1. Resguarda da inviolabilidade de valores apontados por ponteiros;2.2. Auxlio na compreenso das caractersticas de funes, durante a implementao.

    SimblicasConstantes simblicas podem ser criadas com as diretivas do preprocessador #define. Neste modo os valores, defato, no so interpretados imediatamente pelo compilador, antes so identificados e substituidos pelopreprocessador no estgio anterior compilao. Por exemplo:

    #define BUFFER_LENGTH 2048

    ...

    ...

    ...

    char data[BUFFER_LENGTH];

    Observe que o valor 2048 ser usado logo abaixo no cdigo, depois que o preprocessador substituir a constantesimblica BUFFER_LENGTH pelo valor que lhe foi atribudo.Note que as constantes so escritas com todas as letras maisculas, isso no uma regra, mas ajuda a identificar oque constante simblica dentro do programa, sendo adotado pela maioria dos desenvolvedores como uma boaprtica de programao.Neste caso, podemos definir valores simblicos compostos, por exemplo:

    #define BUFFER_LENGTH 2048

    #define N_BUFFERS 100

    #define MASTER_LENGTH ( BUFFER_LENGTH * N_BUFFERS )

    ...

    ...

    ...

    char screen[MASTER_LENGTH];

    Os valores podem ser simblicos em formato de cdigo, o que permite criar programas com melhor legibilidade.Para isso podemos colocar expresses com funcionalidades bem definidas substitudas por nomes que asidentifiquem. Por exemplo:

    float a[3];

    #define PRINT_VECTOR cout

  • Variveis e constantes 13

    PRINT_VECTOR;

    Desta forma, todas as vezes que quisermos mostrar o valor do vetor de trs coordenadas podemos usar a constantePRINT_VECTOR.

    LiteraisConstantes literais podem ser declaradas da mesma forma que na linguagem "C", ou seja, podemos definir valoresfixos em qualquer parte do programa, expressando-os diretamente no cdigo atravs de seu valor significativo. Porexemplo, podemos definir nmeros:

    256 //decimal

    0400 //octal

    0x100 //hexadecimal

    Tambm podemos definir valores para caracteres ou cadeias de caracteres, como segue:

    'a' // um caractere

    "abc" // uma cadeia de caracteres

    "\xF3\x23\x12" // uma cadeia de caracteres representada por seus

    valores em hexadecimal

    Temos ainda a possibilidade de declarar constantes compostas por valores e operadores:

    (4.23e14 * (12.75 + 12976.18/36)) // constante composta

    EnumeraesValores enumerados so muito recorrentes nos ambientes de programao, por isso podemos contar com adeclarao de enum em C++ tambm, o que segue a mesma sintaxe que temos em "C":

    enum seq {A,B,C,D};

    seq x;

    ou ainda:

    enum nomes {LANY=100,SANDRA=200,MARCIA=300,RODRIGO=400};

    nomes x;

    Porm, observamos uma diferena: a palavra enum pode ser dispensada na declarao da varivel, enquanto que emC obrigatrio,apesar desta pequena diferena a funcionalidade do recurso a mesma, ou seja, pode-se definirvariveis que assumem estritamente os valores presentes na declarao de enumerao.Este recurso torna-se til na padronizao de valores a serem usados como entrada de funes, por exemplo. Podeser considerada como uma funcionalidade mnemnica, seu uso no altera o cdigo final caso modifiquemos oprograma para que use variveis inteiras ou strings de mesmo valor do enum.A seguinte sintaxe:

    seq x = 3;

    No permitida, mesmo que o valor presente no enum seja avaliado como 3 pelo compilador em tempo de compilao. Isso pode parecer confuso, mas lembre-se de que os valores sero atribuidos pelo compilador, logo isso

  • Variveis e constantes 14

    evita que o mesmo programa seja compilado em ambientes diferentes e tenha comportamento diferente.

    VariveisAs variveis no C++ podem ser usadas da mesma forma que na linguagem "C", porm algumas poucas diferenaspodem ser destacadas, principalmente aquelas que trazem linguagem C++ caractersticas prprias da orientao aobjetos.

    TiposComo na linguagem "C", os tipos nativos do compilador em uso so referenciados por:

    char

    int

    float

    double

    Que correspondem a nmeros com tamanho relativos, com os significados respectivos: caractere, inteiro, pontoflutuante e ponto flutuante de dupla preciso. De qualquer forma a extenso dos mesmos depende da mquina que sepretende programar. Considerando que nem sempre teremos que programar apenas computadores, poderemos terextenses bem distintas dependendo do hardware a ser programado, por exemplo, computadores domsticostipicamente tem processadores de 32 ou 64 bits hoje em dia, enquanto que dispositivos embarcados podem terprocessadores de 8, 16 ou 32 bits. Portanto, o compilador para cada caso atribui faixas diferentes para cada tipo emcada situao.A linguagem C++ introduz o tipo bool, que representa o valor booleano, falso ou verdadeiro, o que no existe nalinguagem "C", porm seu tamanho na memria depende da capacidade de otimizao do compilador usado.Tipicamente os compiladores para computadores usam uma varivel do tamanho de char para representar o valor, oque poderia ser considerado um desperdcio, mas devido abundncia de memria no chega a ser inadequado.Porm em sistemas pequenos h compiladores que armazenam o valor booleano em apenas um bit. Obviamente, se oprocessador possuir recursos de manipulao de bits isso muito til e pode ser usado como um fator de melhoria daqualidade do software desenvolvido. Em outros ambientes, onde a manipulao de bits traga prejuzo para odesempenho usa-se a estratgia padro de desperdiar um pouco de espao em favor de uma agilidade maior nasoperaes. Portanto, embora as variaes de utilizao do espao sejam muitas, o compilador sempre far a maisapropriada para cada ambiente de utilizao da linguagem.

    ModificadoresO C++ conta com os modificadores de amplitude (short,long) presentes na linguagem "C" e modificadores deacesso, alguns exclusivos do C++, que esto diretamente ligados a caractersticas da POO (programao orientada aobjetos). Desta forma descreveremos apenas os tipos relevantes exclusivamente para a programao na linguagemescopo do livro presente sem nos aprofundarmos na teoria por trs dos mesmos. A prtica do uso dos mesmos melhor indicada como meio de aprofundamento do tema.Assim contamos com os modificadores da linguagem "C":

    static

    short

    long

    unsigned

    signed

  • Variveis e constantes 15

    const

    A linguagem C++ introduz um novo modificador chamado const, que tem comportamento variado dependendo dolocal onde est sendo declarado. Sua funo, basicamente, estabelecer um vnculo entre declarao eobrigatoriedade da coerncia no uso do smbolo declarado.A princpio, quando declaramos uma constante com este modificador fazemos com que seja obrigatrio o uso dosmbolo de forma que o mesmo no possa ter seu valor alterado. Assim, se fizermos:

    const int x = 4;

    O inteiro x no poder deixar de ter valor igual a 4. Qualquer tentativa de modificar o valor da constante ao longo doprograma ser reportada como erro pelo compilador. Porm podemos considerar esta funcionalidade como bvia etrivial, ainda temos o uso do modificador de uma forma mais proveitosa, na passagem de parmetros para funes,por exemplo:

    void inhibitX(const int *x)

    {

    ...

    ...

    BASEADDRESS = z*((*x) - 23p*71);

    ...

    ...

    }

    Neste caso, a funo acima recebe um valor inteiro atravs de um ponteiro, que no obrigatoriamente precisa serconstante no escopo fora da funo, porm dentro da mesma a varivel ser constante. Fazendo este simplesprocedimento teremos como fazer com que um smbolo seja varivel fora da funo e constante dentro da mesma, deforma que dentro do escopo da mesma s faamos leituras do seu valor. O artifcio cria duas consequnciasimportantes: a primeira a melhor legibilidade do cdigo, visto que ao usarmos uma funo teremos certeza de queos valores no sero alterados dentro da funo; a segunda que poderemos evitar erros inadvertidos de atribuiode valores varivel quando da construo da funo.

    volatile

    Uma varivel "voltil", como a prpria expresso sugere, uma varivel que pode ser modificada sem oconhecimento do programa principal, mesmo que esta ainda esteja declarada dentro do escopo onde o programa estsendo executado. Isso est relacionado, principalmente a processos concorrentes e "threads", estes podem alterar ocontedo da varivel em eventos fora da previsibilidade do tempo de compilao. Em outras palavras, o compiladorno pode prever com segurana se pode otimizar trechos de programa onde esta varivel se encontra.A palavra reservada volatile destinada as situaes onde uma varivel pode ter seu valor alterado por fatoresdiversos, e portanto, no pode ser otimizada. Usando-a o programador informa ao compilador que no deve interferirna forma com que o programa foi escrito para acesso a esta varivel. Desta forma impede que erros inseridos porotimizao estejam presentes na verso final do executvel.O uso desta palavra implica em mudana no comportamento do compilador durante a interpretao do cdigo. Asclasses de objetos do tipo volteis s podero ser acessadas por rotinas que declarem aceitar como entrada dadosvolteis, da mesma forma que apenas objetos volteis podem acessar variveis volteis. Esta "amarrao" faz comque o uso de tais variveis se torne mais seguro.Podemos declarar variveis volteis da seguinte forma:

    volatile int x;

  • Variveis e constantes 16

    Enquanto que para funes que acessam tais variveis teremos consequncias visveis na montagem do cdigo, porexemplo, se tivermos o seguinte trecho de programa:

    int x = 1265;

    void main_loop()

    {

    while( x == 1265)

    {

    // fazer alguma coisa

    }

    }

    Poderemos ter uma otimizao gerada pelo compilador como segue:

    int x = 1265;

    void main_loop_optimized()

    {

    while( true )

    {

    // fazer alguma coisa

    }

    }

    Considerando que em um programa que foi desenhado para ambiente multitarefa isso no pode ser consideradoverdadeiro, pois o programa pode estar esperando que uma das tarefas modifique o estado da varivel paraprosseguir seu curso, a otimizao acima ser um desastre, uma vez que a funo acima jamais ser encerrada.Para evitar isso fazemos:

    volatile int x = 1265;

    void main_loop()

    {

    while( x == 1265)

    {

    // fazer alguma coisa

    }

    }

    E o compilador no poder mais avaliar que o valor de x pode ser otimizado para o valor corrente, pois informamosna declarao que o valor da varivel pode ser alterado sem seu conhecimento. Desta forma o mesmo no alterar oalgortmo e far o teste da varivel dentro do while.

  • Variveis e constantes 17

    Nomeando tiposA linguagem "C" possui recursos de nomeao de tipos simples e compostos atravs das palavras chaves typedef estruct. Adicionada a estas o C++ acrescenta a palavra chave class. Vejamos como devemos definir um novo tipoatravs desta palavra chave.A palavra class atribui a um conjunto de tipos de dados o estado de modelo de objeto. Este conceito fundamentalpara o modo avanado de programar usando o C++. Com este identificador declaramos objetos, da mesma forma quedeclaramos estruturas.Uma classe pode ser definida em um cabealho "header", da seguinte forma:

    class nome_da_classe

    { variavel_1;

    variavel_2;

    .

    .

    .

    variavel_n;

    -----

    nome_funcao ( variavel_1, variavel_2, variavel_3 ...);

    };

    O mais interessante de observar a presena de uma funo dentro da declarao acima. Ento poderamosperguntar: Por que colocar uma funo dentro de um tipo? A resposta simples: Para manipular os dados dentro dotipo! No apenas por esta caracterstica, mas por vrias outras que aboradaremos nos captulos seguintes, o tipo class extremamente flexvel e poderoso. importante ressaltar que em C++ a declarao do identificador: enum, struct, class, etc... dispensado quando sedeclara uma varivel ou objeto para o referido tipo. Desta forma podemos ter tambm as seguintes declaraes comovlidas, alm do uso padro da linguagem "C":

    struct data{ int a;

    int b;

    int c;

    };

    class object{ int a;

    char b;

    long w;

    float p;

    void getData();

    };

    ...

    ...

    ...

    ...

    void func()

    { data x;

    object y;

  • Variveis e constantes 18

    ...

    ...

    y.getData();

    }

    Como podemos ver na funo acima se a varivel x for declarada para uma estrutura data o uso da palavra structno obrigatrio, assim como tambm no o para outros tipos de dados compostos.

    Ponteiros

    PonteirosEm linguagem "C", podemos definir variveis ponteiro, ou seja, variveis que armazenam o endereo de outrasvariveis. Este recurso largamente explorado pela linguagem, embora que deva ser usado com cautela poriniciantes devido ao seu poder destrutivo. Como linguagem "irm mais nova" o C++ tambm permite o uso deponteiros, o que a distingue de muitas outras linguagens orientadas a objeto. Embora seja muito difundida a idia dacriao de linguagens que no suportem acesso a ponteiros, basicamente pressupondo que todos os programadoresso inexperientes, a falta deste recurso limita as capacidades de interao de programas com o hardware. Em outraspalavras, a falta de um meio de manipular ponteiros faz a linguagem limitada ou dependente de fabricantes debibliotecas que acessem o hardware.A disponibilidade do uso de ponteiros em C++ agrega um poder a mais ao conjunto da linguagem, porm implica emnecessidade de cautela na elaborao de programas que usam deste recurso. Certamente, nem todos osprogramadores precisam ser considerados inaptos, a priori, atravs da supresso ou insero de complicadores derecursos criados explicitamente para for-los a no usar dos recursos. Por isso, a linguagem C++ disponibiliza orecurso para quem deseja utiliz-lo e tambm apresenta diversos outros recursos que so alternativas ao uso deponteiros quando eles no so imprescindveis.

    O operador *O operador *, chamado de apontador, funciona em C++ da mesma forma que em C. Considerando que tenhamosuma varivel ponteiro p: Em p armazena-se o endereo de memria que queiramos manipular. Na maioria das vezes obtemos o endereo

    de outra varivel e colocamos em p; Se p um ponteiro, *p o valor apontado por p, ou seja, o valor que est armazenado no endereo de memria

    que queremos ler ou alterar.Na declarao de variveis, uma varivel declarada com * um ponteiro.Exemplo:

    int *px;

    Muitas vezes, iniciantes podem se sentir confusos porque quando declaramos um ponteiro usamos o * e quandoatribumos endereos a ele no usamos o *. A conceituao bsica a seguinte: Declaramos o ponteiro com *, para que o compilador identifique que a varivel um ponteiro; Usamos o ponteiro sem *, para acessar o endereo que ele aponta na memria; Usamos o ponteiro com *, para acessar o valor do dado armazenado na posio de memria;

  • Ponteiros 19

    O operador &Na linguagem "C", o operador & tem duas funes bsicas, funciona como operador da funo lgica AND e comooperador de leitura de endereos. Para operaes com vetores, isso usado da seguinte forma:

    int a = 12;

    int *pa;

    ...

    ...

    pa = &a;

    ...

    ...

    *pa = 100;

    Ou seja, declaramos a varivel a, depois declaramos um ponteiro pa, atravs do operador & obtemos o endereo de ae atribumos o valor 100 varivel usando o ponteiro ao invs da varivel a. Desta forma alteramos o valor de aindiretamente.Um outro uso de & (que no tem similar em "C") pode ser visto mais adiante, em ../Referncias de dados/, mas, paraisto, necessrio estudar o que so ../Funes/.

    O ponteiro "this"Imagine que tenhamos criado um objeto qualquer de uma classe X, se quisermos ter acesso ao ponteiro que contm aposio de memria onde est armazenado este objeto basta chamar o ponteiro "this". O ponteiro "this" uma dascaractersticas dos objetos em C++ e algumas outras linguagens que suportam orientao a objetos. Ele ummembro inerente a todos os objetos que instanciamos em programas escritos em C++.Faremos uma breve explanao a respeito de objetos para esclarecer este tpico. Objeto so parecidos comestruturas, uma diferena bsica que estes possuem "habilidades especficas" representadas por funes que estodentro do seu escopo. Vejamos um exemplo:

    struct Data

    { int x,y;

    int get_x(){ return x;}

    int get_y(){ return y;}

    int set_x(int a){ return x=a;}

    int set_y(int b){ return y=b;}

    };

    Observe que a estrutura acima, apresenta dois inteiros e duas funes para cada um deles, uma que atribui o valor eoutra que l o valor de uma das mesmas. Detalhes das implicaes a respeito desse modo de operar os valores serodados nos captulos seguintes que tratam de objetos. Por ora vamos nos ater a um conceito fundamental importantepara a noo de ponteiros em C++, a identidade de um objeto.Veja, temos uma estrutura de dados que est na memria, os dados esto l (variveis x e y), porm as funes noestaro l, pois se tivssemos que copiar uma funo para cada estrutura que crissemos o programa tomaria umtamanho monstruoso. O que se faz apenas guardar o endereo da estrutura em um ponteiro especial, o ponteirothis. Assim, o compilador poder criar uma nica cpia de funo para todas as estruturas que criarmos e depoisquando a funo quiser manipular os dados de uma estrutura em particular, o far atravs do ponteiro this.Examinemos os detalhes mais de perto... Digamos que instanciemos um objeto "A" da classe Data:

  • Ponteiros 20

    Data A;

    A.set_x(2);

    A.set_y(7);

    Para acessar estas funes o compilador far:

    Data A;

    A.set_x(2);

    // { Data *this = &A;

    // return this->x = 2;

    // }

    A.set_y(7);

    // { Data *this = &A;

    // return this->y = 7;

    // }

    Desta forma podemos perceber como diferentes conjuntos de dados podem ser manipulados pela mesma funo.Quando declaramos uma funo dentro de uma estrutura de dados esta rotina recebe um ponteiro com o endereo doconjunto de dados que deve tratar toda vez que for invocada pelo programa. Assim, sempre acessar os dados atravsdeste ponteiro, o this. Como todos os objetos precisam ser identificados por esse ponteiro, ele definido paraqualquer objeto com o mesmo nome: this.

    Vetores

    Vetores e MatrizesFaamos uma pequena reviso de conceitos: Vetores e matrizes so variveis compostas homogneas, ou seja, so agrupamentos de dados que

    individualmente ocupam o mesmo tamanho na memria e so referenciados pelo mesmo nome, geralmente soindividualizadas usando-se ndices.

    Vetores distinguem-se das matrizes apenas pela caracterstica de ter dimenso (1 x n) ou (n x 1), essencialmentevetores so matrizes linha ou matrizes coluna.

    Em linguagem "C" vetores e matrizes so usados abundantemente para compor estruturas de dados necessrias paracomposio de diversos recursos. Esta usa, mais explicitamente, vetores de caracteres para definir cadeias de texto, oque conhecido como o mais trivial uso de vetores. Alm deste recurso, o "C" tambm define meio de criao dematrizes tipo (n x m), provendo, desta forma os recursos necessrios para criao destes conjuntos de dados.A linguagem "C++" suporta os mesmos recursos e permite a criao de matrizes de objetos. Uma vez que um objeto essencialmente um tipo de dado criado pelo programador, todas as caractersticas bsicas legadas aos "tipos" emgeral so observados nos tipos criados (classes de objetos).

  • Vetores 21

    VetoresOs vetores em C++ seguem a mesma notao da linguagem "C", via de regra declara-se o tipo seguido de umasterisco. Para acessar o valor apontado pela varivel usa-se um asterisco de forma semelhante, como pode ser vistono trecho de cdigo abaixo:

    int *x;

    int a = 3;

    x = &a;

    cout

  • Vetores 22

    equivalente a soma de suas variveis internas para ser alocado na memria.

    Declarando arranjoOs arrays permitem fazer o seguinte:

    int a1, a2, a3,.a100; equivalente a ter int a[100];

    Ou seja permite declarar muitas variveis de uma forma bem simples, poupa escrita e bastante compreensvel. O nmero que est dentro de brackets [] o size declarator. Ele que vai permitir ao computador dizer quantas

    variveis a serem geradas e logo quanta memria dever ser reservada. A memria reservada para as variveisvo ser todas seguidas, um int a seguir ao outro

    H uma forma para no dizer o valor deste size declarator, mas isso apenas acontece antes da compilao, ou sejao compilador que vai fazer esse preenchimento por ns, visualizando o nosso cdigo e contanto os membros quecolocmos. Isto um automatismo dos compiladores recentes. chama-se a isto iniciao implcita que vamos vernesta seco.

    As variveis geradas pelos arrays vo ser todos do mesmo tipo. Reparem que o valor do size declarator um nmero. literal, ele no vai mudar quando o programa estiver a

    correr. Por isso quando no soubermos o nmero de elementos o que fazemos?Veja uma tentativa:

    #include

    using namespace std;

    int main ()

    {

    int numTests;

    cout > numTests;

    int testScore[numTests];

    return 0;

    }

    Isto vai dar um erro de compilao, porque o array est a espera de uma constante e no uma varivel. H umamaneira de contornar isto que atravs da memria dinmica que vamos dar mais tarde, num capitulo prprio, poisisto vai envolver muitos conceitos.

    ConstantesReparem que h uma diferena entre literais e constantes, apesar de em ambos os casos o valor no alteradodurante a execuo do programa, a constant um nome que representa o valor, o literal o valor.

    Declarar constantes exatamente como declarar uma varivel com duas diferenas:1.1. A declarao comea com a palavra const. Isto vai dizer ao compilador que uma constante e no uma varivel2.2. Teremos de atribuir logo o valor na declarao, ou seja, fazer a iniciaoExemplo:

    const int numTests = 3;

    Portanto se tentarmos colocar um outro valor ao numTest, isso vai dar um erro de compilao

  • Vetores 23

    Array index

    a[100] composto por a[0], a[1], a[99] ( De a[0], a[1], a[99] existe 100 posies)

    Pergunta: Porque que o ndex comea em zero e no um? Ou seja temos as 100 posies que pedimos mas o ndexcomea no zero e no no 1. A razo disto tem a ver com offset que refere ao valor adicionado para o endereo basepara produzir a segunda address. Bem no entendi bem! Eu explico de novo: O endereo (address) do primeiroelemento do array, o mesmo do que o endereo base do prprio array. ah espera a, o que esto a dizer que oendereo do array igual ao do primeiro elemento do array. Assim o valor que teria de ser adicionado, ao endereobase do array, para conseguirmos o endereo do primeiro elemento seria zero. Agora sim, percebi!Erro: Um erro comum esquecer que o index comea no zero, e portanto quando se querem referir ao ltimoelemento, esquecem-se que tm de subtrair uma unidade. O que advm desse esquecimento que podem estar aalterar memria pertencente a uma varivel, instruo,..de um outro programa. Ou seja vai existir violao dedados.Se o array for declarado globalmente em vez de ser localmente, ento cada elemento inicializado ao valor defautque zero.

    IniciaoIniciao, se bem se recordam atribuir um valor a uma varivel ao mesmo tempo que declaramos a varivel.Podemos fazer a iniciao de um array de 2 maneiras:1) explicit array sizing

    int testScore[3] = { 74, 87, 91 };

    float milesPerGallon[4] = { 44.4, 22.3, 11.6, 33.3};

    char grades[5] = {'A', 'B', 'C', 'D', 'F' };

    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"};

    Pergunta: O que que acontece se dermos mais valores de atribuio do que elementos do array?

    int a[3] = { 74, 87, 91, 45 };

    Isto vai dar um erro de compilao too many initializersPergunta: O que que acontece se tivermos menos valores do que os elementos

    int a[3] = { 74 };

    No acontece nada simplesmente no temos valores para a[1] e a[2]. Porm em alguns compiladores os elementosno inicializados ficam com os valores defaut, que no caso dos ints 0 no caso dos floats 0.0 e nos caracteres ocaractere nulo ("\0"). No entanto se no inicializarmos um dos elementos, os restantes elementos tero de ser noinicializados pois caso contrrio teremos um erro de compilao2) implicit array sizing

    int testScore[ ] = { 74, 87, 91 };

    float milesPerGallon[ ] = { 44.4, 22.3, 11.6, 33.3};

    char grades[ ] = {'A', 'B', 'C', 'D', 'F' };

    Aqui o compilador faz o trabalho por ns, conta os elementos e preenche o nmero de elementos

  • Vetores 24

    Caracter arraychar name[ ] = {'J', 'e', 'f', 'f', '\0' };

    char name[ ] = "Jeff";

    Ambas as inicializaes so permitidas. Porm tomar ateno ultima iniciao! Quando colocmos as aspas duplaso compilador acrescenta o "\0" na array que cria! No tem []!! Esta at costuma ser a preferida pelos programadores, ao estilo de strings (Na verdade as strings so arrays de char mas vamos falar disso num capitulo prprio)O char "\0" o escape sequence para caracterer null. Este escape sequence sinaliza ao cout o fim do character array. o ltimo elemento do array preenchido! Se no tivssemos este carcter apareceriam estranhos caracteres a seguirao "jeff", chamados "caracteres-lixo". (porqu?) Isto no significa que o ltimo elemento deva ser sempre o nullcarcter

    Arrays de vrias dimensesPodemos ter duas dimenses

    tipo_da_varivel nome_da_varivel [altura][largura];

    como tambm poderamos ter infinitas

    tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN];

    Iniciandofloat vect [6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };

    int matrx [3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

    char str [10] = { 'J', 'o', 'a', 'o', '\0' };

    char str [10] = "Joao";

    char str_vect [3][10] = { "Joao", "Maria", "Jose" };

    Peguemos no exemplo:

    int a [2][3]={1,2,3,4,5,6,}

    Na memria teramos as coisas assim. ou seja os elementos so seguidos e do mesmo tipo

    a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

    1 2 3 4 5 6

    Portanto ter int a [2][3] equivalente a ter int a [6] o nome que se d que diferente.Pergunta: ser pedido espao par 6 ints ou antes um espao com o tamanho de 6 ints? Como ns sabemos que osarrays os elementos tm endereos de memoria consecutivos, por isso, no podem ser pedidos 6 ints, pois se fosseesse o caso, poderia acontecer que eles no ficassem juntos.

  • Vetores 25

    Const Constant arraysconst int daysInMonth [] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

    Recordar que temos de inicializar quando queremos fazer uma constante array

    Atribuir valores ao array#include

    using namespace std;

    int main ()

    {

    int testScore[3];

    cout > testScore[0];

    cout > testScore[1];

    cout > testScore[2];

    cout

  • Vetores 26

    {

    int testScore[MAX];

    for (int i = 0; i < MAX; i++)

    {

    cout

  • Vetores 27

    }

    Vamos torn-lo mais modular, escrevendo uma funo para atribuir valores ao array e outa funo para mostrar osvalores do array

    #include

    using namespace std;

    void assignValues(int[], int);

    void displayValues(int[], int);

    const int MAX = 3;

    int main ()

    {

    int testScore[MAX];

    assignValues(testScore, MAX);

    displayValues(testScore, MAX);

    return 0;

    }

    void assignValues(int tests[], int num)

    {

    for (int i = 0; i < num; i++)

    {

    cout

  • Vetores 28

    }

    Este exemplo por acaso est muito curiosoPergunta: mas agora deveramos perguntar se neste caso tnhamos uma passagem por valor ou referncia.Quando um array passado para uma funo, a funo recebe no a cpia do array mas invs disso o endereo,address do primeiro elemento do array, que igual ao valor do array (base).Assim todas as modificaes que se efectuarem na funo que foi chamada iro repercutir-se no array passado.Vamos confirmar:

    #include

    using namespace std;

    void doubleThem(int a[], int size);

    int main()

    {

    int a;

    int myInts[10] = {1,2,3,4,5,6,7,8,9,10};

    doubleThem(myInts, 10); //passei o array base

    for (a=0; a

  • Estruturas 29

    Estruturas

    Breve reviso

    ConceitoDa linguagem "C" tambm temos o conceito de estrutura, do qual faremos uma pequena reviso agora. Como todossabemos, nem todos os dados que precisamos usar podem ser agrupados em matrizes. Frequentemente usamos dadosde diversos tipos diferentes, com tamanhos diferentes. Para tipos de dados de diferentes tamanhos existem estruturasde armazenamento de dados heterogneos.O especificador struct usado para esta finalidade. Com ele podemos criar tipos que armazenam dados compostospor agrupamentos de outros tipos primitivos da linguagem. Geralmente, os dados so armazenados de forma afacilitar a identificao de cada campo de dados que pretende-se manter, para isso usamos nomes para cada campodentro da estrutura de dados, de forma a ter um meio de acess-la depois.Estruturas so blocos bsicos de informao e so manipulados de maneira primitiva. Basicamente o compiladorinstrui a montagem de um cdigo que manipula-as de forma a copiar, referenciar e obter posio na memria. Todasas outras formas de tratar os dados devem ser providas pelo cdigo do programa.

    ImplementaoPara criar um tipo de dados composto heterogneo, basicamente, cria-se uma lista de tipos e nomes de variveisseparadas por ponto e vrgula. Podemos imaginar esta lista como um bloco de cdigo, em linguagem C, onde estopresentes apenas as declaraes de variveis. Para isso temos a seguinte sintaxe:

    struct Estrutura

    {

    NomeVariavelA;

    NomeVariavelA2;

    NomeVariavelA3;

    NomeVariavelB;

    NomeVariavelC;

    NomeVariavelD;

    ...

    ...

    NomeVariavelZ;

    } [];

    O nome da varivel composta pode ser omitido na declarao da estrutura e depois definido onde for maisapropriado, geralmente, dentro de algum bloco de cdigo onde venha a ser usado. Podemos ver logo abaixo, oexemplo de uma declarao de estrutura:

    struct Estrutura

    {

    int Inteiro;

    double PontoFlutuante;

    char Caracteres[10];

    };

  • Estruturas 30

    int main()

    {

    Estrutura MinhaVariavelComposta;

    ...

    ...

    ...

    return 0;

    }

    Acessando dados internosO modo de acesso a variveis internas de uma estrutura feito atravs do operador ponto ".", porm, quando usamosponteiros para guardar o endereo de uma estrutura usamos o operador seta "->". Vejamos um pequeno trecho decdigo:

    Estrutura st;

    Estrutura *pst;

    st.Inteiro = 200;

    pst = &st;

    pst->PontoFlutuante = 23.976;

    Estruturas em C++As estruturas em C++ funcionam de modo anlogo ao apresentado em linguagem "C". A diferena, a princpio,notvel entre elas nas duas linguagens que em "C++" o especificador struct no precisa ser escrito quando criamosa estrutura:Em C, para criar uma estrutura de dados chamada st, declaramos:

    struct Estrutura st;

    Para fazer o mesmo em C++, declaramos:

    Estrutura st;

    Este simples detalhe revela uma caracterstica importante das estruturas em C++: Nesta linguagem as estruturas sotratadas como tipos primitivos de objetos. Elas tm caractersticas semelhantes s classes, que veremos nos captulossubsequentes.As estruturas em C++ tambm podem conter funes alm de dados. Este fato vem da ideia de modelo de objeto queas estruturas mantm nesta linguagem. Objetos devem ter propriedades (variveis) e mtodos (funes membro), porisso temos a possibilidade de criar funes dentro do corpo das estruturas, com a finalidade de lidar com os dadosque elas mantm.

  • Estruturas 31

    ConstrutoresOs construtores so funes que so criadas automaticamente sempre que tentamos criar um objeto. Eles funcionamda mesma maneira que construtores de classe. A esses que so criados automaticamente so os chamados de defaut.Se escrevermos o cdigo:

    #include

    #include

    using namespace std;

    const int MAX = 3;

    struct Person

    {

    string name;

    int height;

    };

    int main ()

    {

    Person p1;

    cout

  • Estruturas 32

    #include

    #include

    using namespace std;

    const int MAX = 3;

    struct Person {

    string name;

    int height;

    Person()

    {

    name = "No name assigned";

    height = -1;

    }

    };

    int main ()

    {

    Person p1;

    cout

  • Estruturas 33

    };

    int main ()

    {

    int metro;

    string strName;

    cout metro;

    cin.ignore();

    Person p1(strName,metro);

    cout

  • Estruturas 34

    int metro;

    string strName;

    cout metro;

    cin.ignore();

    Person p1(strName, inches);

    cout

  • Operadores 35

    operaes e alter-las quando nos seja conveniente.

    Entendendo o operadorBasicamente, temos dois tipos de implementao para operadores, o tipo global e o tipo membro de classe. Os doistipos so usados regularmente nas implementaes mais comuns. Analisaremos o tipo global, uma vez que ainda notemos uma noo de classes suficiente para abordar o tipo membro de classe.Digamos que temos uma estrutura ponto, como definida abaixo:

    struct Ponto

    { int x;

    int y;

    };

    Uma vez que tenhamos definido um ponto, nada mais natural que queiramos somar, subtrair, enfim operar, pontosdiferentes de acordo com nossas necessidades. Para isso podemos criar operadores para fazer isso, da seguinte forma: Observamos a quantidade de parmetros, o retorno e a forma de chamar o operador que queiramos definir e

    criamos uma funo que execute a operao desejada; Inserimos o cdigo da referida funo dentro de uma chamada de operador, usando a palavra reservada operator

    seguida do operador que desejamos definir:

    Ponto operator+ ( Ponto a, Ponto b )

    { Ponto soma;

    soma.x = a.x + b.x;

    soma.y = a.y + b.y;

    return soma;

    }

    E assim, o operador entendido como uma funo, sendo a sobrecarga um processo de definio da operao a serexecutada. Recebe esse nome porque todo operador j existe e a definio de uma nova funcionalidade apenasadiciona (sobrecarrega) as habilidades anteriores do operador. Embora isto seja comum, bom lembrar queoperaes de tipos primitivos no podero ser modificadas, restando apenas a funcionalidade de criar operadorespara nossos tipos (classes).

    Os argumentosAgora vejamos como os argumentos so vistos pelo compilador durante a chamada ao operador. Essa sintaxe, muitasvezes, confunde iniciantes, mas bastante intuitiva. Veja:c = a + b;

    Consideremos que a,b,c so pontos. Em termos gerais, qualquer operador binrio (com dois argumentos) definido emescopo global, receber a e b como primeiro e segundo argumento da funo que define o operador.Podemos ver a chamada da seguinte forma:

    c = operator+( a, b );

  • Operadores 36

    Operadores aritmticosOperadores aritmticos so utilizados para efetuar operaes matemticas entre dados. So 5 operadores aritmticosem C++:

    #include

    using namespace std;

    int main() {

    int soma = 5 + 5; // o operador '+' realiza somas.

    double subtracao = 5 - 5; // o operador '-' efetua subtrao.

    float multiplicacao = 5.1 * 0.5; // o operador '*' efetua

    multiplicao.

    char divisao = 100 / 2; // o operador '/' efetua diviso.

    int modulo = 51 % 5; // retorna o resto da diviso inteira.

    cout

  • Operadores 37

    Diviso real

    A diviso real aquela efetuada entre tipos ponto flutuante ou entre ponto flutuante e inteiros/caracteres. Issoefetuar a diviso at que o resto seja zero, ou quando o resto repetir-se indefinidamente (no caso de dzimasperidicas como, por exemplo, 10/3).Se quisermos que a diviso entre inteiros retorne a diviso real, deveremos efetuar uma converso explcita,conforme o exemplo:

    int num = 3;

    int num2 = 2;

    cout

  • Deciso e controle de fluxo 38

    if-else

    if

    Se voc quer que o software execute um determinado comando somente em certas situaes, utilize if paradeterminar isto. O programa vai, ento, executar a primeira linha de cdigo aps o if, se a declarao entreparnteses for verdadeira. Exemplo:

    #include

    using namespace std;

    int main(void) {

    int variavel;

    cout > variavel;

    if(variavel == 5)

    cout

  • Deciso e controle de fluxo 39

    booleano falso.Podemos ainda encadear vrios else, e obter ainda mais possibilidades:

    if(deposito < 20) {

    cout

  • Deciso e controle de fluxo 40

    Cada um dos casos tem de ser uma constante (no pode alterar durante a vida do programa), neste exemplo A, B,

    O defaut serve para a condio de todas as avaliaes dos casos anteriores der falsa. ( tipo o else) O break serve para terminar o switch, caso contrrio se num dado case fosse verdadeiro, iria executar todos os

    statementes mesmo de outros cases at terminar o switch. Aqui para cada caso no necessitamos de {} se tivermos mais do que 2 statements. o if-else mais forte do que o switch por que permite fazer coisas como:

    if (apples == oranges)

    do this;

    else if (sales >= 5000)

    do that;

    Para alm do ponto j dito de os casos serem obrigatoriamente constantes, no switch Tambm posso utilizar operadores lgicos no switch

    switch (age >= 18 && citizen == true)

    {

    case true:

    cout

  • Deciso e controle de fluxo 41

    5>3 ? a : b // returns the value of a, since 5 is greater than 3. a>b ? a : b // returns whichever is greater, a or b.

    O Comando gotoO goto realiza um salto para um local especificado. Este local determinado por um rtulo. Portanto pode ser emqualquer parte do programa.

    nome_do_rtulo:

    ....

    goto nome_do_rtulo;

    ....

    // goto loop example

    #include

    using namespace std;

    int main ()

    {

    int n=10;

    loop:

    cout

  • Estruturas de repetio 42

    Estruturas de repetioLaos (loops em ingls), ou estruturas de repetio, so comandos existentes nas linguagens de programaodestinados a executar uma ou mais instrues quantas vezes forem necessrias. Cada ciclo de um loop chamado deiterao. Podemos ter tambm loops dentro de outro loop.

    WhileO while, "enquanto" em ingls, um lao que ordena o computador a executar determinadas instrues enquantouma condio for verdadeira. Isso faz com que um comando seja executado uma vez a cada verificao da condio.De modo geral o comando sempre deve ser elaborado de forma que se leve a condio de execuo a ser falsa emalgum momento, de forma a interromper o lao para que o resto do programa entre em execuo.

    Sintaxewhile (condio)

    comando;

    Onde condio a condio de execuo do lao while.O cdigo abaixo mostra o uso do lao while para imprimir na tela do nmero 1 ao nmero 10. Perceba o uso de umavarivel inteira intitulada contador. Esta varivel utilizada para armazenar um valor a ser impresso bem comoparticipar da condio de execuo do lao. Assim que a varivel atingir o valor 11 o programa segue para ocomando logo aps o lao.

    #include

    using namespace std;

    int main()

    {

    int contador; // Declara a varivel contador.

    contador=1; // contador recebe o valor 1.

    while (contador

  • Estruturas de repetio 43

    Do-WhileO lao do-while um while invertido, onde voc coloca as instrues a serem repetidas antes da verificao dacondio de execuo. Isso significa que os comandos do lao sero executados ao menos uma vez.

    Sintaxedo {

    comando;

    } while (condio);

    Onde condio a condio de execuo do lao do-while. Os comandos pertencentes ao lao somente deixaro dese repetir quando a condio for falsa.O algoritmo abaixo mostra como seria o algoritmo exemplo usado na seo do lao while convertido para o uso dolao do-while.

    #include

    using namespace std;

    int main()

    {

    int contador; // Declara a varivel contador.

    contador=1; // contador recebe o valor 1.

    do {

    cout

  • Estruturas de repetio 44

    fixo, dez no algoritmo em questo.

    #include

    using namespace std;

    int main()

    {

    int contador; // Declara a varivel

    contador.

    for (contador=1; contador

  • Estruturas de repetio 45

    Dicas

    Bloco de ComandosEm muitos casos, os laos devem repetir dois ou mais comandos. Para isso, necessitamos criar um bloco decomandos contendo todas as instrues a serem repetidas. A criao de um bloco de comandos simples, bastacolocar todos os comandos entre chaves { }. Os algoritmos de exemplo dos laos while e do-while fazem uso de umbloco de comandos.Caso o lao no encontre a abertura de um bloco logo em seguida, ele assumir que o comando imediatamenteabaixo o nico que deve ser repetido.Exemplo 1:

    while (condio)

    comando1; // Este comando faz parte do lao.

    comando2; // Este comando no faz parte do lao.

    Exemplo 2:

    while (condio)

    {

    comando1; // Este comando faz parte do lao.

    comando2; // Este comando faz parte do lao.

    }

    O Comando breakO que o break faz quebrar a execuo para fora do bloco de cdigo onde ela est presente

    #include

    using namespace std;

    int main(void)

    {

    int num;

    char choice;

    bool quit = false;

    while (true)

    {

    cout > num;

    if (num > 0)

    break;

    else

    {

    cout > choice;

    if (choice != 'Y')

    {

    quit = true;

    break;

    }

  • Estruturas de repetio 46

    }

    }

    if (quit == false)

    cout

  • Estruturas de repetio 47

    int num = 2;

    cout

  • Estruturas de repetio 48

    cout

  • Funes 49

    FunesFuno, do latim functio, onis, representa na computao, um pequeno algoritmo com uma funo simples e bemdefinida. como se cada funo fosse um micro programa, ou um tijolo na construo do programa principal. O usode funes facilita muito o desenvolvimento, pois, divide o problema principal em pequenos problemas maissimples. Essa tcnica se chama, Dividir para conquistar.A experincia mostra que o uso de funes facilita e acelera a criao e manuteno de sistemas.Todo programa em C++ tem pelo menos uma funo, o main. Veja o exemplo do programa em C++:

    #include //Biblioteca com funes de entrada e sada de dados

    using namespace std;

    int main (void) //Funo principal do programa

    {

    cout

  • Funes 50

    int i_f,i_c; //if is a reserved word

    df = 75.0;

    ff = 75.0;

    i_f = 75;

    // The compiler resolves the correct

    // version of ConvertFToC based on

    // the arguments in each call

    cout

  • Funes 51

    Parmetros default (padro)Pode acontecer que tenhamos que declara varia vezes o mesmo valor como parmetro de uma funo. Parasimplificar a chamada a funes que variam pouco podemos definir uma parmetro default.

    #include

    #include

    /*-----------------------------Cabealho--------------------------------*/

    /*Definimos uma funao*/

    void function(int a,int b, int c = 100 )

    {

    printf("Meu Primeiro argumento :%d\n",a );

    printf("Meu Segundo argumento :%d\n",b );

    printf("Meu terceiro argumento :%d\n",c );

    getchar();

    }

    int main (void)

    {

    function( 10, 30);

    /* Agora use a funo assim e veja o que acontece */

    // function( 10,30,999);

    }

    Os parmetros por default devem ser os ltimos da lista, ou seja, mais direita. O parmetro padro deve serespecificado no prottipo e no na declarao da funo.

    Referncias de dados

    Variveis de refernciaEm C++ podemos criar variveis que podem ser uma alternativa para os ponteiros em algumas situaes. Avantagem de no usar diretamente o endereo (valor de ponteiro) em situaes onde no precisamos lidardiretamente com valores de memria torna a programao mais segura e simplificada. Podemos deixar as operaescom ponteiros apenas para quando for estritamente necessrio.Variveis de referncia podem ser criadas para dar um nome diferente para as variveis que j existem no programa,ou para passar a varivel para dentro do corpo de uma funo. Observemos, inicialmente, um caso simples:

    int a = 10;

    int &b = a;

    b = 20;

    Neste trecho de programa, criamos uma varivel de referncia b para a varivel a, o que significa que criamos outronome para a varivel a. De fato, b a prpria varivel a com outro nome, apenas isso. Desta forma, podemos alteraro valor de a usando b.

  • Referncias de dados 52

    Passagem de parmetrosNa linguagem "C", durante a chamada de uma funo, os argumentos (parmetros) tm seus valores copiados para area de processamento da funo. Depois que os mesmos foram usados dentro do bloco de processamento da funo,eles so descartados. A funo retorna o processamento para o bloco que a chamou trazendo apenas o valor deretorno. A nica maneira de fazer com que a funo modifique o valor de alguma varivel definida no bloco deprograma que a chamou pass-la por um ponteiro com o seu endereo.Vejamos o fragmento de cdigo seguinte:

    int f( int x )

    {

    x--;

    return x;

    }

    int main()

    {

    int a = 10;

    int b;

    b = f(a);

    ...

    ...

    Em "C", a menos que o programador seja bem malicioso e faa manipulaes de memria arriscadas, a funo fjamais alterar o valor do seu argumento x.Diferentemente da linguagem "C", a chamada a uma funo em C++ pode alterar o valor de uma varivel definidaantes da chamada da funo, mesmo sem esta varivel ser explicitamente passada como um ponteiro. Este modo chamado de passagem por referncia. Em termos mais gerais, significa a passagem da varivel propriamente dita,para o corpo interno da funo com outro nome, aquele definido na lista de parmetros da funo.Em C++, uma funo pode ser chamada na forma acima e alterar o valor das suas variveis. Para isso bastadeclar-la como:

    int function(int & x)

    {

    x--;

    return x;

    }

    Temos em C++ o operador & que se comporta diferentemente de C, tendo uma funo a mais, a de criar variveis dereferncia: &x quando usado no cdigo retorna o pointero para o endereo de x; &x quando usado na declarao de varivel, cria uma referncia; &x quando usado como parmetro na declarao de uma funo faz com que suas chamadas transfira o

    argumento/parmetro passando-o de forma similar a passagem de seu pointero. (Passagem por referncia).Em termos semnticos, ao passar a varivel para uma funo onde o parmetro uma referncia, o endereo davarivel atribudo ao endereo do parmetro. Desta forma, o parmetro a mesma varivel passada, no trecho decdigo onde a funo foi invocada, assumindo um nome diferente dentro da funo.Vejamos um exemplo usando a funo anterior:

  • Referncias de dados 53

    int m = 4;

    function(m);

    cout

  • Referncias de dados 54

    int &ref = val1;

    cout

  • Referncias de dados 55

    Comparao entre passagem por referncia e ponteirosPara exercitar vamos criar um novo problema: Criar um funo que duplique qualquer valor colocado peloutilizador:

    1 PROGRAMA-via referncia 2 PROGRAMA via ponteiros - endereos

    #include

    using namespace std;

    void doubleIt(int&);//prototype com endereo de variavel

    int main ()

    {

    int num;

    cout > num;

    doubleIt(num); //chamo funo, passando parametro num

    cout

  • Entrada e sada de dados 56

    Entrada e sada de dados

    Entrada e sadaAqui vamos dar incio ao estudo de recursos que possibilitaro inserir dados e fazer reporte da falta deles.No C++ a entrada e sada podem ser feitas atravs da biblioteca iostream. Para podermos us-la deveremos colocar alinha de cdigo: #include A estrutura de comunicao com o meio externo em modo texto composta por um conjunto de objetos. Estas, emconjunto com operadores e funes de formatao possibilitam uma forma de comunicao mais intuitiva. Devido abstrao de elementos do mundo real por recursos da orientao a objetos, a forma de entender o cdigo torna-semais natural.Na biblioteca iosteam, temos os seguintes objetos: cin - Este objeto fornece entrada de dados "bufferizada" atravs do "standard input device", o dispositivo de

    entrada padro; cout - Este objeto fornece sada de dados "bufferizada" atravs do "standard output device", o dispositivo de sada

    padro; cerr - Este objeto fornece sada de dados no "bufferizada" para o standard error device, o dispositivo de erro

    padro, que inicialmente definido para a tela. clog - Este objeto fornece sada "bufferizada" atravs do "standard error device", o dispositivo de erro padro que

    inicialmente definido para a tela.O foco de orientao a objetos que a biblioteca iostream confere aos dispositivos de entrada e sada uma dascaractersticas da linguagem C++. Ele est presente na maneira na qual o cdigo foi idealizado e est formatado,modificando a maneira como as partes do sistema de entrada/sada interagem. Desta forma, as operaes de interaoentre o usurio e o software tornam-se mais intuitivas para o programador.O sistema de entrada e sada um exemplo deste modelo de programao, onde cada entidade fsica ou lgica deentrada e sada representada por objetos cujas operaes podem ser acessadas diretamente nos programas.

    BufferPara entendermos um pouco mais sobre Buffer, se faz necessrio recordar um pouco sobre o funcionamento damemria e suas operaes relacionadas a Buffer.Bufferizao um meio de sincronizao entre dispositivos de velocidades diferentes, tais quais memria edispositivos de armazenamento mecnicos, como discos magnticos. Para evitar que as operaes do dispositivomais lento interfiram no desempenho do programa pode-se fazer com que os dados sejam colocados em umamemria mais rpida e depois sejam enviadas ao dispositivo mais lento a medida que ele tenha disponibilidade parareceb-los, desta forma temos os seguintes modos de escrita em dispositivos de sada: unbuffered significa que qualquer mensagem ou dados sero escritos imediatamente. o caso da escrita no

    dispositivo cerr; buffered - significa que os dados sero mantidos num buffer de memria at que o dispositivo de destino solicite,

    ou que um comando de descarregamento seja executado, ou quando o buffer estiver cheio. O problema que se oprograma interrompido antes do buffer ser escrito esses dados so perdidos.

  • Entrada e sada de dados 57

    coutcout

  • Entrada e sada de dados 58

    \\ barra oposta (contrabarra) (\)

    cinO objeto cin obtm informao do "standard input" (que usualmente o teclado). Este objeto est tal como o coutdeclarado no cabealho da biblioteca A sintaxe mais comum da instruo para obter dados do cin : cin >> [variable name];Aqui temos o operador de extrao ">>" que diz que tudo o que o teclado escrever, coloque esses dados na varivelque me segue. Este operador consegue at traduzir o conceito de dados de fora para dentro.

    #include

    using namespace std;

    int main(void)

    {

    int testScore;

    cin >> testScore;

    cout

  • Entrada e sada de dados 59

    Aqui j no temos a questo de dar a volta ao intervalo permitido, aqui temos o caso em que vai ser colocado umnmero estranho. Isto no est perfeitamente explicado.Chama-se prompt quando dito ao utilizador o que deve fazer, o que no deixar como no exemplo anterior o cursora piscar sem o utilizador saber o que fazer. Alm de que temos o problema de overflow em execuo, portanto bomque o utilizador cumpra os requerimentos.De uma maneira muito conveniente, os dados recebidos pelo cin so tratados de forma a tornar o processopolimrfico, da mesma forma que no caso de cout, assim temos como receber os dados da maneira que precisamos,ou seja, quando declaramos uma varivel int e a usamos para receber um dado do cin, o mesmo convertido naentrada para inteiro, quando usamos uma varivel de outro tipo, a entrada convertida para o tipo da varivel.

    Lendo um caractereLer um caractere at simples, basta utilizar o objeto cin e ser guardado o valor digitado na varivel.

    char nivel;

    cout > nivel;

    Porm teremos de pressionar a tecla ENTER depois de digitar o caractere. Isto leva a vrias questes.O problema pressione uma tecla para continuar...

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout > ch;

    if (ch != 'S' && ch != 's')

    cout

  • Entrada e sada de dados 60

    A funo cin.get()J tivemos oportunidade para discutir a funo getline (funo membro) do objeto cin.

    cin.getline(name,80);

    Aqui vamos utilizar uma outra funo, a cin.get().Esta funo pode ser chamada, tal como a getline(), atravs de 3 argumentos, onde o primeiro o array de caracteres,mas tambm o pode ser sem argumentos ou ainda apenas um argumento.No caso de no conter argumentos apenas ir ler um caractere, em vez de uma cadeia de caracteres.No caso de ter um argumento, ela aceita qualquer tecla incluindo o enter. (o que no se passa com o cin e o operadorde extrao). Aqui um exemplo

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout

  • Entrada e sada de dados 61

    Ou seja, na segunda iterao, retirado o caractere nova linha que ficou da 1 iterao - e colocado na varivelch. Agora o "input buffer" est vazio.

    cin.ignore()Uma soluo limpar o caractere nova linha do "input buffer" antes da chamada da funo getline(). E fazemos issousando a funo ignore() do objeto cin.Esta funo membro tal com a get() e a getline() so sobrecarregadas, podem ser chamadas sem argumentos, com umou dois argumentos.Utilizar a funo ignore() sem argumentos, permite que o prximo caractere no "input buffer" seja lido e depoisdescartado,- e isto exatamente aquilo que queramos.A funo com 1 ou 2 argumentos usada para cadeias de caracteres. Com um argumento, o argumento o nmero mximo de caracteres a ser removido do "input buffer". Exemplo:

    cin.ignore(80); // Remove at 80caracteres do input buffer

    Com dois argumentos, o segundo argumento o delimitador, um caractere que se encontrado, antes do nmero decaracteres especificado no primeiro paramento, faz com que a remoo pare. Exemplo:

    cin.ignore (80, '\n'); // Remove 80 caracteres se at l no encontrar

    o nova linha.

    Reescrevendo o cdigo anterior utilizando o cin.ignore()

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout

  • Entrada e sada de dados 62

    Se pressionarmos a tecla Enter para continuar, teremos de fazer isso duas vezes, pois a primeira vez ignorada. Arazo: que no existe nada no "input buffer" quando a funo ignore chamada, por isso que a tecla enternecessita de ser pressionada 2 vezes, colocando um caractere nova linha a mais no "buffer" para a funo ignore()remover.Se tentarmos modificar isto atravs do if?

    #include

    using namespace std;

    int main(void)

    {

    char ch;

    do {

    cout

  • Entrada e sada de dados 63

    cout

  • Entrada e sada de dados 64

    Razo: A funo get() com um argumento deixa o caractere nova linha no "input buffer" se pressionarmosum caractere e o enter. mas no deixar, se apenas pressionarmos o enter. portanto necessrio confirmar.

    Entrada de valores para variveis mltiplasPodemos fazer com que o programa receba vrios valores ao mesmo tempo

    cin >> [first variable] >> [second variable] >> [third variable];

    Neste caso o utilizador separa os dados por espaos (o enter tambm d) e como anteriormente o utilizador fechautilizando o enter

    #include

    #include

    using namespace std;

    int main(void)

    {

    int peso, altura;

    string nome;

    cout > nome >> peso >> altura;

    cout

  • Entrada e sada de dados 2 65

    Entrada e sada de dados 2

    Entrada/Sada em ficheiros (arquivos)Nota introdutria: Este capitulo geralmente colocado uns captulos mais para o fim, mas acho por bem que setorne as coisas mais interativas, o que possvel introduzindo agora operaes em arquivos, d muito maisentusiasmo. Encontramos aqui conceitos avanados mas podero ser deixados para depois se o leitor no quiserobservar o tema neste momento.

    Gravar (Salvar) os dados para um ficheiro(arquivo)Os dados que mantemos nos programas esto guardados na memria RAM, que limpa quando o programa oucomputador para de funcionar. Isso implicaria que perderamos toda a informao! Porm existe uma maneira paratornar os dados persistentes que gravar os dados num ficheiro (arquivo) no "hard drive" (disco rgido) ou no outromeio persistente. Nas formas mais diretas de escrita podemos passar os dados em formato binrio para oficheiro(arquivo). Outros meios avanados para guardar dados podem envolver bases de dados relacionais ou XML.

    O que um ficheiro(arquivo)?Um arquivo uma coleo de dados que esto localizados numa memria persistente tipo hard drive, cd-rom, etc.Para identificarmos o arquivo podemos atribuir-lhe um nome (filename). Os "filenames" tm usualmente umaextenso, que determina o tipo de arquivo em sistemas operacionais semelhantes aos da Microsoft, mas que podemser dispensados em sistemas operacionais que guardam as caractersticas dos arquivos no meio de armazenamento,tais quais sistemas UNIX e seus similares GNU/Linux, FreeBSD, etc... A extenso representada por 3 ou 4 letrasque seguem aps o nome do arquivo e um ponto ".". Por exemplo: "joao.doc" ou "joao.odt". Isto diz-me que temosum ficheiro(arquivo) que se chama "joao", e que tem a extenso .doc que refere usualmente a documentos do WORDno primeiro caso e com extenso ".odt" do OpenOffice no segundo. Outros tipos de extenses podem ser ".xls" paradocumentos EXCEL, ".ods" para planilhas do OpenOffice. ou ainda ".cpp" para ficheiros(arquivos) de cdigos dec++.

    Ficheiros(Arquivos) binrios e tipo textoExistem na verdade dois tipos de ficheiros(arquivos): os do tipo texto e os do tipo binrio. Os arquivos tipo texto apenas armazenam texto obedecendo uma codificao de caracteres, a mais comum a

    ASCII, isto implica no uso do cdigo para armazenamento, ou seja, pode ser que a codificao seja interpretadaantes de ser efetivada no meio de armazenamento.

    Os arquivos binrios podem guardar mais informao, como imagens, base de dados, programasPor exemplo,editores de texto com formatao, como o OpenOffice e o Word, guardam os seus arquivos em formatos binrios,porque eles possuem alm do texto, informao acerca da formatao do texto, para as tabelas, as listasnumeradas, tipo de fonte, etc... da aparecerem os caracteres de formatao tipo 6, L, h5

    Os arquivos binrios podero ser mais bem explorados em um tpico avanado, vamos trabalhar inicialmente comarquivos tipo texto, que poderemos operar de maneira mais simplificada.

  • Entrada e sada de dados 2 66

    biblioteca padro fstreamAt agora temos usado a biblioteca iostream (i de input + o de output + stream), que suporta, entre vriasfuncionalidades, o objeto cin para ler da "standard input" (que usualmente o teclado) e o objeto cout para "standardoutput" (que usualmente o monitor)Ora, agora queremos ler e escrever para ficheiros(arquivos) e isso requer a biblioteca fstream (f de file + stream).Esta biblioteca define 3 novos tipos de classe: ofstream (apenas para sada "out to a file". serve para criar, manipular ficheiros (arquivos) e escrever, no serve

    para ler). ifstream (apenas para entrada "in from a file" . serve para ler ficheiros (arquivos), receber dados dos mesmos,

    no serve para criar nem escrever). fstream (este conjuga os dois tipos anteriores, "input and output to file". cria ficheiros (arquivos), escreve e l

    informao dos mesmos.

    Abrir um ficheiro(arquivo)Um ficheiro(arquivo) deve ser aberto pelo programa para que o mesmo possa ser manipulado, a abertura do arquivoimplica, entre outras coisas, em atribuir um identificador que nos permita ter acesso aos seus dados. necessriocriar uma linha de comunicao entre o arquivo e o objeto stream.Podemos recorrer a dois mtodos para abrir um ficheiro (arquivo):1.1. Usando um construtor;2.2. Usando a funo membro chamada de "open".

    Usando o ConstrutorO construtor uma funo que automaticamente chamada quando tentamos criar uma instncia de um objeto.

    fstream afile; // criado uma instncia do fstream chamada

    de afile

    Os construtores de objetos podem ser sobrecarregados, ou seja, para a mesma classe podemos ter um construtor semargumentos, com um argumento, dois argumentos, etc. No exemplo anterior criamos um sem argumentos. Osconstrutores no retornam valores, geralmente o compilador reporta erro quando se declara funes que retornamvalor e estas tm o mesmo nome da classe, pois este nome reservado para os construtores. Vamos dar um exemplocom dois argumento:

    ofstream outfile ("joao.doc", ios::out);

    Chama o construtor com dois argumentos, criando uma instncia de ofstream e abrindo o ficheiro(arquivo)"joao.doc" para operaes de sada.

    Usando a funo membro "open"Esta funo tem como primeiro argumento o nome e localizao do ficheiro/(arquivo) a ser aberto, o segundoargumento especifica o modo de abertura.Sobre a questo da localizao existem 2 tipos, o "path" relativo e o "path" absoluto. Para este ltimo indicamos ocaminho todo: "c:\\....\\joao.doc" em sistemas Microsoft ou "/home/joao/joao.odt" para sistemas UNIX esimilares. O "path" relativo dispensa essa descrio se o ficheiro/(arquivo) estiver (na mesma directoria)/(no mesmodiretrio) que o programa.Sobre a questo do modo de abertura temos as seguintes modalidades:

  • Entrada e sada de dados 2 67

    Modo doabertura

    sinalizador(Flag)

    Descrio

    ios::app "Appendmode"

    Todos os dados do arquivo so preservados e qualquer sada escrita a partir do fim do arquivo.

    ios::ate Se o arquivo j existe,o programa vai diretamente ao seu fim.O modo de escrita ento feito de formaaleatria.Usado normalmente com arquivos do modo binrio(binary mode).

    ios::binary "Binarymode"

    Informaes so escritas na forma binria e no na forma textual(text mode).

    ios::in "Input mode" Leitura de informaes de arquivo(no ir criar um arquivo novo)

    ios::out "Outputmode"

    Informaes sero escritas no arquivo.

    ios::trunc Se o arquivo j existe,suas informaes sero truncadas, outra forma de se dizer: deletadas e reescritas.

    Os sinalizadores (flags) so nmeros em potncias da base binria, portanto podemos ter vrios flags ao mesmotempo se usarmos o operador unrio para a operao "OU", como no exemplo abaixo:

    ofstream outfile; //crio o objeto outfile

    outfile.open("students.dat", ios::binary | ios::app); /*chamo a funo

    membro open do objeto,

    com o 1

    parmetro que o nome do arquivo

    e o 2 o modo

    de abertura. */

    Observe que estamos abrindo o arquivo "students.dat" em modo binrio e ao mesmo tempo com o modo "append",isto significa que abriremos o arquivo e poderemos preservar o seu contedo anterior inserindo os novos dados nofim do arquivo.

    Comparando os dois mtodos (pela funo membro e pelo construtor)O primeiro mtodo similar a ter

    int age;

    age=39;

    O segundo mtodo similar a

    int age=39;

    A escolha do melhor mtodo em cada situao depende do contexto em que estamos criando o cdigo, geralmentequando j temos o objeto criado e ele est fechado podemos abrir um novo arquivo com ele e depois fech-lonovamente, isto nos sugere que usemos a funo open quando o objeto deve abrir arquivos diferentes em cada trechode cdigo, embora que possam surgir outras funcionalidades, dependendo de como o projeto foi idealizado.

  • Entrada e sada de dados 2 68

    Abrir um arquivo para leituraA histria aqui a mesma s tem uma diferena: que no caso de leitura, no ser criado nenhum ficheiro (arquivo)caso ele no exista.

    ifstream arq; //cria objeto "arq"

    arq.open (joo.doc); //chama funo membro open ao objeto "arq", com o

    //parmetro do nome do ficheiro

    Poderamos fazer o mesmo com o construtor:

    ifstream arq (joo.doc);

    Ou ainda

    fstream bloco;

    bloco.open("joao.doc", ios::in)

    ou ainda

    fstream b(joao.doc, ios::in)

    H mais uma nota a fazer, se quisermos ler e escrever, no podemos usar o ofstream e o ifstream ao mesmo tempo,teremos de usar o fstream. Teremos de fazer:

    fstream a (joo.doc, ios::in | ios::out);

    Neste caso, o comportamento padro preservar o contedo do ficheiro (arquivo) ou cri-lo caso ele no exista.

    Verificar se o ficheiro (arquivo) foi aberto.Vamos verificar o que acontece quando tentamos abrir um arquivo que no existe, a primeira verso do nossoexemplo observa o comportamento bsico do fstream:

    #include

    #include

    using namespace std;

    int main ()

    {

    ifstream arq; //crio objeto "arq" da classe

    ifstream - leitura

    arq.open("joao.doc"); //chamo funo membro open

    cout

  • Entrada e sada de dados 2 69

    }

    No caso do ficheiro (arquivo) joao.doc no existir:

    (arq) = 00000000

    (arq.fail()) = 1

    No caso do ficheiro (arquivo) joao.doc existir no mesmo diretrio que o programa:

    (a) = 0012FE40

    (a.fail()) = 0

    Repare que o resultado a impresso do endereo, do objeto a de ifstream. d um ponteiro!!Agora, vajamos um exemplo mais completo:

    #include

    #include

    using namespace std;

    int main ()

    {

    ifstream arq; //crio objeto "arq" da classe

    ifstream - leitura

    string str;

    arq.open("joao.doc"); //chamo funo membro open

    if (arq.is_open() && arq.good())

    {

    arq >> str;

    cout

  • Entrada e sada de dados 2 70

    Fechar um ficheiro (arquivo)Devemos fechar depois de ler e/ou escrever. Mas por que, se o objeto do ficheiro ir ser fechado assim que oprograma acabar? Porque estamos a utilizar recursos com um ficheiro (arquivo) aberto, porque alguns sistemasoperativos (operacionais) limitam o n de ficheiros (arquivos) abertos, e estando este aberto impede que outros sepossam abrir e por fim porque se no fecharmos, outros programas no podero abri-lo at que o fechemos. Estecomportamento faz parte de um esquema de controle de acesso usado pelo sistema para assegurar que os arquivosno sero usados por processos diferentes ao mesmo tempo.

    ofstream outfile;

    outfile.open("students.dat");

    // ....

    outfile.close();

    Vamos criar um exemplo mais real. Queremos criar um programa que escreva informao inserida pelo utilizadornum ficheiro por ns escolhido

    #include

    #include

    using namespace std;

    int main ()

    {

    char data[80]; //criamos um array de 80 caracteres

    ofstream outfile; //criamos objeto da classe ofstream

    outfile.open("joao.doc"); //chamamos a funo membro da classe

    para o objeto criado.

    // Esta funo membro cria o arquivo

    "joao.doc"

    if (outfile.is_open() && outfile.good()) //verificamos se est tudo

    bem

    { cout

  • Entrada e sada de dados 2 71

    }

    Podemos ir ver o novo ficheiro/arquivo com o nome joao.doc e tem l escrito aquilo que digitamos.Agora vamos tentar ler o que escrevemos no documento criado.

    #include

    #include

    using namespace std;

    int main ()

    {

    char data[80];

    ifstream infile;

    infile.open("joao.doc");

    if (infile.is_open() && infile.good()) //verificamos se est tudo bem

    { infile >> data; //colocamos os dados abertos no array

    cout data; //colocamos os dados abertos no array

    cout data; //colocamos os dados abertos no array

    cout

  • Entrada e sada de dados 2 72

    return 0;

    }

    Agora j obtemos 2 palavras e so apresentadas em linhas diferentes. Mas temos de arranjar um mtodo para noestar a repetir constantemente, podemos fazer isso com

    infile.getline(data, 80);

    Ento ficamos com:

    #include

    #include

    #include

    using namespace std;

    int main ()

    {

    string data;

    ofstream outfile;

    outfile.open("joao.doc");

    if (outfile.is_open() && outfile.good()) //verificamos se est tudo

    bem

    {

    cout

  • Entrada e sada de dados 2 73

    getline(infile, data);

    cout data;

    while(!infile.fail())

    { infile >> data;

    cout

  • Entrada e sada de dados 2 74

    {

    cout

  • Entrada e sada de dados 2 75

    bool writeFile (ofstream&, char*);

    bool readFile (ifstream&, char*);

    int main ()

    {

    string data;

    bool status;

    ofstream outfile;

    status = writeFile(outfile, "students.dat");

    if (!status)

    {

    cout

  • Entrada e sada de dados 2 76

    getline(infile, data);

    }

    infile.close();

    }

    #ifdef WIN32

    system ("pause");

    #endif

    return 0;

    }

    bool writeFile (ofstream& file, char* strFile)

    {

    file.open(strFile);

    return !(file.fail()||!file.is_open()||!file.good());

    }

    bool readFile (ifstream& ifile, char* strFile)

    {

    ifile.open(strFile);

    return !(ifile.fail()||!ifile.is_open()||!ifile.good());

    }

    ManipuladoresOs objetos das classes "stream" podem ser configurados para fornecer e reportar os dados de maneira pr-formatada.Da mesma maneira que temos a formatao quando usamos funes de formatao, como printf() e scanf(), nalinguagem C, podemos usar os manipuladores na linguagem C++ para informar os objetos streams em que formatodesejamos receber os dados deles ou fornecer para eles.Abaixo temos uma srie de manipuladores teis:

    Manipulator Uso

    boolalpha Faz com que variveis tipo bool sejam reportadas como "true" ou "false".

    noboolalhpa (padro) Faz com que variveis tipo bool sejam reportadas omo 0 ou 1.

    dec (padro) Determina que variveis tipo inteiras (int) sejam reportadas na base 10.

    hex Determina que variveis tipo inteiras (int) sejam reportadas em hexadecimal.

    oct Determina que variveis tipo inteiras (int) sejam reportadas em octal.

    left Faz com que textos sejam justificados a esquerda no campo de sada.

    right Faz com que textos sejam justificados a direita no campo de sada.

    internal Faz com que o sinal de um nmero seja justificado a esquerda e o nmero seja justificado a direita.

    noshowbase (padro) Desativa a exibio do prefixo que indica a base do nmero.

    showbase Ativa a exibio do prefixo que indica a base do nmero.

    noshowpoint (padro) Mostra o ponto decimal apenas se uma parte fracionria existe.

    showpoint Mostra o ponto decimal sempre.

  • Entrada e sada de dados 2 77

    noshowpos (padro) Nenhum sinal "+" prefixado em nmeros positivos.

    showpos Mostra um sinal "+" prefixado em nmeros positivos.

    skipws (padro) Faz com que espaos em branco, tabulaes, novas linhas "\n" sejam descartados pelo operador de entrada >>.

    noskipws Faz com que espaos em branco, tabulaes, novas linhas "\n" no sejam descartados pelo operador de entrada >>

    fixed (padro) Faz com que nmeros com ponto flutuante sejam mostrados em notao fixa.

    Scientific Faz com que nmeros com ponto flutuante sejam mostrados em notao cientfica.

    nouppercase (padro) 0x mostrado para nmeros em hexadecimal e para notao cientfica.

    uppercase 0X mostrado para nmeros em hexadecimal e para notao cientfica.

    Ajustando a largura da entrada/sada setw(w) - Ajusta a largura da sada e entrada para w; precisa ser includo. width(w) - Uma funo membro das classes iostream.

    Preenchimento de espaos em branco setfill(ch) - Preenche os espaos em branco em campos de sada com ch; precisa ser includo. fill(ch) - Uma funo membro das classes iostream.

    Ajustando a preciso setprecision(n) - Ajusta a preciso de casas decimais em nmeros com ponto flutuante, para n dgitos. Este ajuste

    apenas visual, de forma que o manipulador no afeta o modo de clculo do nmero pelo programa.Exemplificando o uso de manipuladores:

    #include

    #include

    #include

    using namespace std;

    int main()

    {

    int intValue = 15;

    cout

  • Entrada e sada de dados 2 78

    cout

  • Entrada e sada de dados 2 79

    int char_count = 0;

    int sentence_count = 0;

    char ch;

    ifstream object("jo.txt");

    if (! object)

    {

    cout

  • Manipulando strings 80

    Manipulando strings

    "Char strings" e StringsOs caracteres so entendidos como sendo nmeros que geralmente tm oito bits, esses nmeros so traduzidos natabela ASCII de 128 caracteres, como existem inmeras regies no mundo com caractersticas lingusticas prprias,a tabela ASCII estendida por um bloco de caracteres acima dos 128 mais baixos que varia de acordo com asnecessidades de cada lngua. A parte superior da tabela ASCII conhecida como parte estendida e referenciada porpginas de cdigos para cada propsito lingustico, isso quer dizer que podemos ter os mesmos nmeros significandocaracteres diferentes para cada regio do mundo.No estilo da linguagem C quando queremos representar um conjunto de caracteres colocamos todos eles em umamatriz sequenciada na memria:

    Endereo relativo 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A

    Dado U m a f r a s e .

    Por exemplo, para declarar um espao na memria que contenha 20 caracteres fazemos:

    char dados[20];

    Este o estilo de strings usado pela linguagem C pura. Para manipular este tipo de string preciso ter certo cuidado,pois a matriz sempre tem um tamanho definido e caso faamos um acesso a um endereo fora da matriz invadiremosoutras reas de memria que no temos como definir o que so, e portanto poderemos fazer o programa parar defuncionar, em muitos sistemas pode tambm haver danos aos outros programas e at mesmo ao prprio sistemaoperacional, porm em sistemas operacionais mais sofisticados como o GNU/Linux, que possuem gerenciamento dememria com proteo de memria, apenas o programa que causou a falha ir parar de funcionar.Para manipular este tipo de string a biblioteca padro da linguagem C dispe de diversas funes, para mais detalhesconsulte o livro Programar em C.No estilo C++, como era de se esperar, as strings so objetos, eles podem ser criados facilmente atravs da bibliotecapadro referenciada pelo arquivo de cabealho . As strings so objetos com recursos que permitemmanipular os seus caracteres com as funcionalidades das funes da linguagem C e mais algumas caractersticasprprias possibilitadas pela orientao a objetos.

    // listandoCodigoASCII.cpp

    #include

    using std::cout;

    using std::cin;

    using std::endl;

    #include

    using std::string;

    using std::getline;

    int main(){

    string anyWord;

  • Manipulando strings 81

    cout

  • Manipulando strings 82

    Funo Descrio

    isalpha Retorna verdadeiro se o argumento uma letra do alfabeto; falso em caso contrrio.

    isalnum Retorna verdadeiro se o argumento uma letra do alfabeto ou um dgito; falso em caso contrrio.

    isdigit Retorna verdadeiro se o argumento um dgito; falso em caso contrrio.

    islower Retorna verdadeiro se o argumento uma letra minscula, falso em caso contrrio.

    isprint Retorna verdadeiro se o argumento um caractere imprimvel (inclundo espaos); falso em caso contrrio.

    ispunct Retorna verdadeiro se o argumento um sinal de pontuao (caracteres imprimveis que no sejam letras, dgitos ou espao); falso emcaso contrrio.

    isupper Retorna verdadeiro se o argumento uma letra maiscula; falso em caso contrrio.

    isspace Retorna verdadeiro se o argumento um espao, tabulao ou nova linha; falso em caso contrrio.

    Strings em C++As cadeias de caracteres da linguagem C podem formatar um novo tipo de dados, porm criar tipos de dados maissofisticados no possvel nesta linguagem, as strings em C++ so objetos da classe string, o que isso traz de novopara o tratamento de textos em programas? A primeira coisa a notar quando criamos strings em C++ a maneira decri-las, a classe disponibiliza uma srie de construtores:

    1 string ( );

    2 string ( const string& st );

    3 string ( const string& st, size_t position, size_t n = npositions );

    4 string ( const char * ps, size_t n );

    5 string ( const char * ps );

    6 string ( size_t n, char ch );

    Isto torna possvel, basicamente, criar string de seis maneiras diferentes:1.1. Podemos definir um objeto string vazio, para futuramente usarmos de acordo com a necessidade;2.2. Podemos criar um objeto string com uma cpia de outro;3.3. Podemos criar um objeto string com uma cpia de uma poro de outra string;4.4. Podemos criar um objeto string com uma cpia de uma parte de uma "char string";5.5. Podemos criar um objeto string com uma cpia de uma "char string";6.6. Podemos criar um objeto string preenchida com uma quantidade definida de um determinado caractere;Quando manipulamos strings, podemos faz-lo com operadores, como por exemplo "+", "+=", "

  • Manipulando strings 83

    5.5. Enviar uma string a um output stream;6.6. Receber uma string do input stream.Apenas com estas poucas informaes j possvel operar strings com bastante flexibilidade e de uma maneiramuito intuitiva, vejamos alguns exemplos:

    string a = "Alice e Beto gostam de ",

    b("chocolate."),

    c = string("doce de leite."),

    d = "pipoca.",

    e(c);

    cout

  • Manipulando strings 84

    Comparando formas de operar strings em C e C++Em C, temos diversas funes que so usadas para manipular strings, para mais detalhes veja o livro Programar emC, aqui faremos uma comparao dos modos de operar strings em C e C++, algumas particularidades da linguagemC++ permitem uma operao mais intuitiva das strings e algumas novas formas de trat-las. Vejamos comomanipular estes dados to comuns em qualquer programa.

    Funes uteis para o uso de stringsstrlen() (str=string + len=length)- aceita um argumento que pode ser um array (uma cadeia) de caracteres, umponteiro (que aponta para um array de caracteres) ou uma string literal. retorna um nmero inteiro que representa onmero de caracteres, no incluindo o caractere "null":

    int len;

    len = strlen("Jeff") // a extenso 4

    char* stinkydog = "Dante";

    len = strlen(stinkydog); // a extenso 5

    char name[80] = "Devvie";

    len = strlen(name); // a extenso 6

    No c++ temos duas funes similares na classe string que so o lenght() e size(). Estas funes no tem argumentospois reportam as informaes sobre o objeto a quem pertencem, ambas retornam um inteiro que representa otamanho das strings:

    string s = "Jeff Kent";

    cout

  • Manipulando strings 85

    Agora, reflitamos no que significa estas operaes: Em primeiro lugar "string" no um tipo primitivo de dado, uma classe, portanto um tipo de dado mais "inteligente", uma das caractersticas dos objetos string que eles soredimensionveis, ou seja, quando atribumos a uma string um dado maior que seu espao interno de armazenamentoela aumenta o seu espao interno para comportar o novo dado. Outra caracterstica que a operao "=" para a string uma operao de atribuio de contedo, de forma que a string copia a outra quando usamos este operador e noapenas o ponteiro que referncia o endereo da string.

    Unir stringsstrcat() (string+concatenate) une duas frases. Recebe 2 argumentos, a frase primria o ponteiro para essearray.

    char target[80] = "Jeff";

    char* source= " Kent";

    strcat(target, source);

    cout

  • Manipulando strings 86

    char str1[80] = "Devvie Kent";

    char str2[80] = "Devvie Kent";

    if (!strcmp(str1, str2))

    cout

  • Manipulando strings 87

    using namespace std;

    string str1 = "check";

    string str2 = "chess";

    if (str1 == str2)

    cout

  • Manipulando strings 88

    #ifdef WIN32

    system ("pause");

    #endif

    return 0;

    }

    Neste exemplo temos a vantagem de o usurio inserir um dgito para o array de caracteres em vez de um inteiro, paraevitar um "run-time error" ou "garbage data" que aconteceria se a entrada fosse no numrica. Depois o array verificado para ver se representa um nmero. Se o numero for negativo tem o caractere "".Em C++ usamos objetos da classe stringstream (biblioteca sstream.h) para armazenar temporariamente os caracteres,depois usamos o operador ">>" para converter os caracteres em nmero, bastando para isto criar a varivel noformato que desejamos receber o nmero. Mais uma vez temos o uso do poliformismo para resoluo de umproblema comum de programao, a operao do ">>" diferente para cada tipo de dado, selecionadaautomaticamente pelo compilador de acordo com o tipo de dado da varivel destino.

    string name = "123";

    stringstream sst;

    int i;

    sst i;

    Os passos acima armazenam o valor 123 na varivel "i", todo processo de converso feito pelo operador ">>".

    Classes

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    ClassesExistem duas categorias de tipos de dados usuais em C++, so classificados como tipos bsicos e tipos definidospelo programador.Assim como na linguagem C, podemos definir dados compostos por associaes dos tipos bsicos, estes tipos sochamados de estruturas (structs). C++ traz uma nova representao de dados, muito semelhante na forma sestruturas, porm diferentes na forma conceitual: a palavra chave class, que usada para criar uma classe de objetosmais rica que as structs. Ao declararmos um identificador, tal qual fazemos ao declarar uma varivel e no lugar dotipo especifiquemos uma classe criaremos um objeto.Antes de prosseguirmos, vejamos um pouco sobre o conceito por trs do uso de objetos. Um objeto entendidocomo uma entidade de dados dentro da memria que, basicamente, deve ser responsvel por seu contedo, ou seja,um objeto deve ser capaz de gerenciar seu contedo autonomamente, ou prover meios de outras entidades de cdigofaz-lo de forma segura.

  • Classes 89

    Origem (atributos)Observemos, por exemplo, o cdigo abaixo:

    struct MyData

    { int n;

    char data[10];

    float nReal;

    };

    Esta declarao, bem conhecida de quem j est familiarizado com a linguagem C, cria um tipo de dado compostoheterogneo, que neste exemplo chamamos de MyData, o que acontece aqui que os dados esto agrupados dentrodesta estrutura, isto promove a possibilidade de manipul-los em conjunto. Um dos problemas com esta estrutura apresena de uma matriz de caracteres chamada "data", observe que a mesma tem um tamanho definido de 10caracteres, imagine que em algum momento da execuo do programa tentamos colocar um caractere na posio 11,ou qualquer posio fora da matriz, neste caso estamos colocando o referido dado em endereos invlidos para aoperao que pretendemos realizar, ou seja, no h controle nenhum que assegure que o cdigo no far um acessofora da rea que pertena a matriz. Um acesso de memria a qualquer elemento da matriz acima da posio 9, farcom que invadamos dados na rea onde a varivel nReal est definida.

    Funes membro (Mtodos)Agora suponha que tenhamos como definir um modo para entrar e outro para ler dados da matriz:

    struct MyData

    { int n;

    char data[10];

    float nReal;

    bool write_data(int pos, char c)

    { if (pos >= 0 && pos < 10)

    { data[pos]=c;

    return true;

    }

    return false;

    }

    char read_data(int pos)

    { if (pos >= 0 && pos < 10)

    { return data[pos];

    }

    return '\0';

    }

    };

    Agora temos assegurados mtodos de incluso e acesso a dados da matriz de caracteres, porm ainda existe umpequeno problema: Quem quiser o antigo mtodo de acesso direto conseguir facilmente, pois os elementos daestrutura esto acessveis publicamente por padro.

  • Classes 90

    ConceituaoO problema da visibilidade pblica dos dados em uma estrutura pode ser resolvido com um dos conceitos de objetos,o encapsulamento. Encapsular os dados, significa reservar o acesso a funes que estejam dentro de um gruporestrito, especializado para tais operaes de manipulao destes dados. Uma das vantagens deste procedimento que o cdigo adquire um formato mais organizado, onde os processos tornam-se claramente distintos, caso tenhamosque analisar o cdigo, cada procedimento estar restrito a partes definidas para cada operao.

    Declarando classesAs estruturas so bem parecidas com as classes, com uma pequena diferena, peguemos o caso da passagem deestruturas como argumentos de funes:

    #include

    #include

    using namespace std;

    class Person

    {

    string name;

    int height;

    };

    void setValues(Person&);

    void getValues(const Person&);

    int main ()

    {

    Person p1;

    setValues(p1);

    cout

  • Classes 91

    cout

  • Classes 92

    else

    name = s;

    }

    int Person::getHeight() const

    { return height; }

    void Person::setHeight(int h)

    {

    if (h < 0)

    height = 0;

    else

    height = h;

    }

    void setValues(Person&);

    void getValues(const Person&);

    int main ()

    {

    Person p1;

    setValues(p1);

    cout

  • Classes 93

    Mas perguntam: Por que que nos demos ao trabalho de recorrer a membros privados em vez de fazer todospblicos? Quando tnhamos uma estrutura no lugar de uma classe, no havia nada que impedisse a colocao devalores invlidos, por isso poderamos ter valores vazios para a string e valores negativos para a varivel "height".Agora que "Person" uma classe, as funes membro podem realizar a validao dos dados antes da atribuio devalores nas variveis. Poderamos fazer com que a funo setName verificasse se a entrada na string seria vazia ecaso fosse, colocaria um valor padro como: sem nome. similarmente poderamos ter "setHeight" para verificar seseriam colocados valores de entrada negativos e caso fossem, colocaria zero, ou no tomaria nenhuma ao.Todas estas caractersticas demonstram o conceito de encapsulamento. A sua finalidade de tornar o cdigo maismodularizado, restringindo o escopo de anlise a partes bem delimitadas dos programas. Devido a este conceitopodemos contar com cdigos mais fceis de analisar e fazer manuteno.

    Instanciando objetosInstanciao de objetos o processo de criar a estrutura lgica dos mesmos na memria. Isto ocorre quandodeclaramos os objetos, pois neste momento todo o processo de construo dos mesmos efetivado. Assim, toda vezque declaramos um objeto estamos instanciando-o, ou seja, estamos criando uma instncia da classe.Podemos declarar os objetos logo aps definir a classe conforme podemos ver no 1 caso logo abaixo. Neste casoteremos a varivel rect criada como um objeto conforme estabelecido pelo modelo definido pela palavra chave class.Este tipo de declarao mais usual para objetos criados globalmente, pois a incluso desta declarao no cabealhopode fazer com que vrios objetos sejam criados com o mesmo nome quando o cabealho invocado de vriosarquivos. Portanto, mais prudente usar esta opo quando a declarao est no arquivo fonte e no no cabealho.1 caso:

    class CRectangle

    {

    int x, y;

    public:

    void set_values (int,int);

    int area (void);

    } rect;

    No 2 caso, apresentado logo abaixo, podemos declarar objetos apenas quando precisarmos. Esta opo de declarar oobjeto depois a mais usada, pois na maioria das vezes temos o modelo dos objetos, a classe, declarada em umarquivo de cabealho enquanto que os objetos sero criados no resto do cdigo fonte. Desta forma mais usual criaras classes em cabealhos e depois declarar os objetos na parte do programa que for mais conveniente.2 caso:

    class CRectangle

    {

    int x, y;

    public:

    void set_values (int,int);

    int area (void);

    };

    int main()

    {

    CRectangle rect;

  • Classes 94

    }

    Em ambos os casos temos

    CRectangle Private public

    int x

    int y

    void set_values (int,int);

    int area (void);

    rect

    Podemos, ento, entender os objetos como blocos de dados que tm propriedades (variveis) e que podem fazer algo(mtodos). Ento, criamos todas as funcionalidades que precisamos que a classe fornea aos programas, fazendo ostestes necessrios para assegurar sua consistncia e estabilidade. Sempre que precisemos utilizar os objetos s temosque instanci-los (declar-los), e no precisamos nos preocupar como eles funcionam internamente, uma vez que osdesenhamos adequadamente.Para entendermos melhor este conceito podemos fazer uma analogia. Consideremos um objeto resistncia: sabemosque temos de us-lo e que ela deve ter certas caractersticas, ento teremos o seu valor em Ohms, sua potnciamxima, tolerncia, entre outras, e teremos uma funo que nos dar a corrente que passa por ela quando lheaplicamos uma tenso eltrica. No precisamos saber de que que ela feita, ou como estas caractersticas internas afaz funcionar, basta-nos receber os resultados.Vejamos o exemplo:Agora vamos mostrar que podemos ter funes membro apenas como prottipos e defini-las fora da classe. Para issousamos o operador de definio de escopo :: que permite definir o local do cdigo onde um identificador existe, noformato: ESCOPO::funo ou ESCOPO::dado. De maneira geral, quando declaramos identificadores dentro daclasse podemos defini-los no escopo global referenciando estes pelo operador de escopo.

    // classes example

    #include

    using namespace std;

    class CRectangle

    {

    int x, y;

    public:

    void set_values (int,int);

    int area () {return (x*y);}

    };

    void CRectangle::set_values (int a, int b)

    {

    x = a;

    y = b;

    }

  • Classes 95

    //repare no :: que pemite-nos definir a funo membro da classe CRectangle fora da classe

    int main ()

    {

    CRectangle rect; //definimos objeto de classe

    rect.set_values (3,4); //objeto-membro

    cout

  • Classes 96

    int getAge();

    void setWeight(int weight);

    int getWeight();

    void speak();

    private:

    int age;

    int weight;

    };

    void Dog::setAge(int age)

    {

    this->age = age;

    }

    int Dog::getAge()

    {

    return age;

    }

    void Dog::setWeight(int weight)

    {

    this->weight = weight;

    }

    int Dog::getWeight()

    {

    return weight;

    }

    void Dog::speak()

    {

    cout

  • Classes 97

    estas informaesAgora planejemos os mtodos. Vamos, primeiramente, assumir que temos a restrio de

  • Classes 98

    um vetor com 4 characteres, ou a variao de qualquer um dos anteriores sem sinal, mas estes detalhes noprecisam estar expostos.

    2.2. Se a representao interna dos dados for modificada, desde que os tipos de retorno e de parmetros das funespblicas mantenham-se inalteradas, no necessitemos de alterar cdigo que utilizem objetos da classe.

    Ou seja, o encapsulamento simplifica a programao escondendo as particulariadades da classe e elimina oretrabalho do cdigo por alteraes da mesma. Geralmente as funes (mtodos) privadas, so auxiliares a outrasfunes da classe.Se nenhum especificador de acesso for usado, todos os membros e metodos so declarados como privados porpadro.H dois mtodos para definir as funes membro: Eles podem ser definidos dentro da classe, o que apropriado para funes pequenas; E funes grandes podem ser definidas fora da classe.Neste caso tero de ser identificadas como pertencentes classe e para isso utilizamos o operador de resoluo deescopo ::.

    Construtores

    ConceitoOs construtores "constructors" so funes membro (mtodos) especiais de uma classe. Permitem a inicializao dasvariveis membro de um objeto. Ou melhor, permitem a construo e a inicializao de objetos das classes. Se noos declararmos o compilador faz isso por ns. Os construtores tm sempre o mesmo nome que a classe.Os objetos so construdos atravs destas funes especiais chamadas de construtores. At aqui no os declaramos,eram criados automaticamente. Estas funes tem certas caractersticas que as fazem distintas das normais, quepermitem que as mesmas construam a estrutura lgica inicial do objeto. Desta forma estas funes so caractersticasda orientao a objetos e servem para criao dos mesmos.Construtores no podem ser chamados explicitamente como fazemos no caso de funes membro regulares. Eles soapenas executados quando um novo objeto da classe criado. Portanto, existe apenas um evento capaz de executarum construtor, a instanciao do objeto.As principais caractersticas dos construtores so: No tm qualquer valor de retorno; No podem ser executados por chamada explcita no cdigo; So executados logo depois que os tipos bsicos do objeto foram criados; Inicializam os dados com os valores que o objeto precisa para comear a funcionar corretamente.

    DeclaraoPodemos criar construtores facilmente, atravs das caractersticas que os distinguem das funes membroconvencionais. Ou seja, definimos uma funo membro que possua o mesmo nome da classe, no tenha tipo deretorno e a declaramos como pblica para que possa ser acessada por quem queira instanciar objetos. Vejamos comodefinir um construtor:

    class Caneta

    { string cor;

    int volume;

    ///////////////

    public:

  • Classes 99

    Caneta( string c, int v );

    };

    Caneta::Caneta( string c, int v )

    { cor = c;

    volume = v;

    }

    Construtores podem iniciar os membros da classe de uma forma simplificada. Este formato usado sempre que oconstrutor tem dados bsicos que podem ser iniciados antes do resto da construo da estrutura do objeto. Podemosiniciar os dados do objeto declarando-o desta forma:

    class Caneta

    { string cor;

    int volume;

    ///////////////

    public:

    Caneta( string c, int v ) : cor(c), volume(v)

    {

    }

    };

    Para faz-lo, como vemos no cdigo, basta listar as variveis membro em uma sequncia depois da declarao donome do construtor e de um sinal de dois pontos ":". Iniciamos uma lista de membros, com o valor a ser atribudoentre parnteses depois de cada um, separando-os por vrgulas.

    Destrutores

    ConceitoAlm do construtor a linguagem C++, assim como outras linguagens orientadas a objeto, possuem outro tipo defuno especialmente criada e gerenciada pela linguagem, os destrutores. Estas so destinadas a desmontar aestrutura do objeto quando o mesmo est sendo encerrado. O destrutor ter o mesmo nome da classe, mas precedidopelo sinal til ~ e tambm no retorna valor.O destrutor tem as seguintes caractersticas: O destrutor chamado quando o objeto est sendo finalizado; usado para liberar qualquer memria que tenha sido alocada;

    DeclaraoFaamos a classe Dog com o construtor e o destrutor.

    class Dog

    {

    public:

    Dog(); //Constructor

    ~Dog(); //Destructor

    void setAge(int age);

    int getAge();

    void setWeight(int weight);

  • Classes 100

    int getWeight();

    void speak();

    private:

    int age;

    int weight;

    };

    Dog::Dog()

    {

    age = 0;

    weight = 0;

    cout

  • Classes 101

    };

    Employee::Employee(char *name, int id)

    {

    _id = id;

    _name = new char[strlen(name) + 1]; //Allocates an character

    array object

    strcpy(_name, name);

    }

    Employee::~Employee()

    {

    delete _name;

    }

    int main()

    {

    Employee programmer("John",22);

    cout

  • Classes 102

    liberar duas vezes para o mesmo endereo, provocando um erro no sistema de alocao dinmica de memria, o queforar o sistema operacional a eliminar o programa da memria.Para resolver esse problema podemos definir um construtor de cpia ("copy constructor") na classe, substituindo aimplementao padro do compilador. Este recurso automaticamente identificado e faz com que o compilador nocrie a sua verso do construtor. Assim, definir um construtor de cpia prprio a maneira mais eficiente quandonossos objetos detm caractersticas que os fazem diferentes do padro.Para criar o construtor basta defin-lo na classe:

    class Employee

    {

    public:

    Employee( const Employee & e);

    Employee(char *name, int id);

    ~Employee();

    char *getName(){return _name;}

    private://Other Accessor methods

    int _id;

    char *_name;

    };

    Employee::Employee( const Employee & e )

    {

    _id = e._id;

    _name = new char[strlen(e._name) + 1]; //Allocates an

    character array object

    strcpy(_name, e._name);

    }

    Agora temos um construtor que pode fazer a cpia da forma correta. Neste novo construtor alocamos uma cadeia decaracteres para copiar o contedo da original no objeto a ser copiado e copiamos o contedo para o novo objeto.Assim, teremos objetos distintos, cada um com seu prprio contedo.

  • Encapsulamento 103

    Encapsulamento

    ConceitoEncapsulamento, em linguagens orientadas a objeto, a capacidade de ocultao de detalhes de implementao porparte de entidades de manipulao de dados. Esta caracterstica visa prover um meio de manter cada classeresponsvel por operaes a elas atribudas sem interferncias externas. A vantagem dessa caracterstica de manteros indivduos de cada classe com funes bem delimitadas e criar meios de criar mdulos onde cada classe faa bemaquilo de que est encarregada, tendo total controle sobre tais operaes.

    Atributos de restrioClasses podem proteger sua estrutura de acessos de outras entidades de dados que no pertencem a seu corpo. Paraisto, em C++ temos atributos de acesso para blocos de dados ou funes membros de classes. Em algumaslinguagens os atributos so definidos para cada membro individualmente.Os atributos de restrio de acesso em C++ so trs: private, public e protected. Cada atributo oferece um nvel deocultao para membros de classes. Eles so usados para assegurar que apenas grupos identificados de cdigotenham acesso a partes presselecionadas da classe.Os nveis de proteo esto ligados ao parentesco do cdigo que pretende acesso com a classe em que os mesmosesto definidos. Mais especificamente, classes que no so filhas da que pretendem acessar s podero ter acesso amembros pblicos, classes filhas tero acesso a membros protegidos (protected) ou pblicos (public) e finalmente,nenhum cdigo que no pertena a prpria classe poder acessar membros privados (private).

    Classes derivadas (pequena introduo)Precisamos dos conceitos bsicos de herana para entender alguns conceitos de encapsulamento. Para no criarmosdependncias circulares entre os tpicos, ou seja, para no dependermos de conceitos de herana que tambm precisade tpicos de encapsulamento, faremos uma pequena introduo dos conceitos de classes derivadas antes deprosseguirmos com o nosso estudo de encapsulamento.Uma classe pode ser estendida a partir de outra, ou seja, podemos reaproveitar um cdigo j existente em umadeterminada classe que j temos e criar uma nova classe com tudo que j existia na primeira, mais o que definirmospara a nova.Vejamos um exemplo bsico:

    class veculo

    {

    string cor;

    string combustivel;

    ...

    ...

    };

    class carro : public veiculo

    {

    int nrodas;

    ...

    ...

    int mover( int nkilometros );

  • Encapsulamento 104

    };

    A segunda classe declarada possui a extenso ": public veiculo" a mais, esta parte refere-se a uma declarao deparentesco. De fato, ao declarar a classe desta forma estamos informando ao compilador que a classe veiculo meda classe carro. Semanticamente, isto significa que a classe carro possui toda a estrutura da classe veiculo alm deseus prprios membros.

    Definindo acessosConsiderando o exemplo anterior, podemos observar que os atributos "cor", "combustivel", "nrodas" poderiam seralterados em qualquer ponto do programa se tivssemos usado a palavra struct, porm usando a palavra class algode diferente ocorre, pois no podemos ter acesso a estes atributos, a menos que estejamos acessando-os atravs defunes definidas dentro das classes.Em classes, o atributo private definido por padro, ou seja, os membros que no tenham definidos os seusatributos de acesso explicitamente, sero definidos como privados. Este comportamento revela a necessidade deresguardar os membros de uma classe atravs de atributos de restries. Em C++, ao definir membros em uma classeantes da definio de qualquer atributo de restrio estamos definindo-os como privados (private).Ainda levando em considerao o exemplo anterior, podemos definir atributos de restries para grupos de membrose modificar o comportamento padro da classe. Se definirmos public, os dados estaro acessveis a qualquer parte doprograma, o que equivalente a coloca-los em uma estrutura com a palavra struct ao invs de dentro de uma classe.Se definirmos protected temos uma situao peculiar, apenas funes membro da classe ou de suas "filhas" poderoacessar dados da classe me.Vejamos o exemplo anterior com algumas alteraes:

    class veiculo

    {

    string cor;

    protected:

    string combustivel;

    ...

    ...

    public:

    bool altCor( string c )

    { if ( c == "vermelho" )

    { cor = c;

    return true;

    }

    if ( c == "azul" )

    { cor = c;

    return true;

    }

    if ( c == "prata" )

    { cor = c;

    return true;

  • Encapsulamento 105

    }

    return false;

    }

    };

    class carro : public veiculo

    {

    int nrodas;

    ...

    ...

    int mover( int nkilometros );

    };

    Neste exemplo definimos que o atributo cor no pode ser modificado, a no ser pela funo altCor(), onderestringimos as cores a um conjunto que desejamos. Observe que ao tentar atribuir qualquer cor diferente de"vermelho", "azul" e "prata", receberemos um retorno "false". Assim, temos a possibilidade de controlar ocomportamento do objeto criado atravs da restrio imposta.O atributo "combustvel" ser manipulado livremente pela classe "veculo" e pela classe "carro", visto que o atributoprotected d visibilidade s classes derivadas de "veiculo". O mesmo mecanismo de controle visto no pargrafoanterior poder ser implementado para acessos fora do escopo das duas classes, ou seja, para funes no escopoglobal ou em outras classes.

    Escopos globaisAt aqui vimos os atributos de restrio sendo usados em classes para encapsular partes internas a elas, porm, existeoutro mecanismo de encapsulamento muito til em C++, os namespaces. Estes "espaos de nomes" so meios dedelimitar reas onde smbolos so usados, o que permite evitar que erros ocorram por coincidncia de nomes.A sintaxe para criao de um namespace bem simples. Vejamos um exemplo de cdigo, para observarmos osdetalhes:

    namespace MeuEspaco

    { void print()

    { cout

  • Herana 106

    Herana

    ConceitoHerana um dos pontos chave de programao orientada a objetos (POO). Ela fornece meios de promover aextensibilidade do cdigo, a reutilizao e uma maior coerncia lgica no modelo de implementao. Estascaractersticas nos possibilitam diversas vantagens, principalmente quando o mantemos bibliotecas para uso futurode determinados recursos que usamos com muita frequncia.Uma classe de objetos "veiculo", por exemplo, contm todas as caractersticas inerentes aos veculos, como:combustvel, autonomia, velocidade mxima, etc. Agora podemos dizer que "carro" uma classe que tm ascaractersticas bsicas da classe "veculo" mais as suas caractersticas particulares. Analisando esse fato, podemosconcluir que poderamos apenas definir em "carro" suas caractersticas e usar "veculo" de alguma forma quepudssemos lidar com as caractersticas bsicas. Este meio chama-se herana.Agora podemos definir outros tipos de veculos como: moto, caminho, trator, helicptero, etc, sem ter quereescrever a parte que est na classe "veculo". Para isso define-se a classe "veculo" com suas caractersticas edepois cria-se classes especficas para cada veculo em particular, declarando-se o parentesco neste instante.Outro exemplo: Imagine que j exista uma classe que defina o comportamento de um dado objeto da vida real, porexemplo, animal. Uma vez que eu sei que o leo um animal, o que se deve fazer aproveitar a classe animal e fazercom que a classe leo derive (herde) da classe animal as caractersticas e comportamentos que a mesma deveapresentar, que so prprios dos indivduos classificados como animais.Ou seja, herana acontece quando duas classes so prximas, tm caractersticas mtuas mas no so iguais e existeuma especificao de uma delas. Portanto, em vez de escrever todo o cdigo novamente possvel poupar algumtempo e dizer que uma classe herda da outra e depois basta escrever o cdigo para a especificao dos pontosnecessrios da classe derivada (classe que herdou).

    SintaxePara declarar uma classe derivada de outra j existente, procedemos de forma a declarar o parentesco e o grau devisibilidade (acesso) que a classe derivada ter dos membros de sua classe base. Para isso seguimos o seguintecdigo sinttico:

    class classe_derivada : [] classe_base {

    //corpo da classe derivada

    }

    Repare que temos o operador ":" ( dois pontos ) como elo entre as duas classes. Este operador promove o"parentesco" entre as duas classes quando usado na declarao de uma classe derivada.O termo [] opcional, mas se estiver presente deve ser public, private ou protected. Ele define o grau devisibilidade dos membros da classe base quando a classe derivada precisar acess-los.Exemplo de implementao:

    // Demonstra herana.

    #include

    using namespace std;

    class veiculo_rodoviario // Define uma classe base veculos.

    {

    int rodas;

    int passageiros;

  • Herana 107

    public:

    void set_rodas(int num) { rodas = num; }

    int get_rodas() { return rodas; }

    void set_pass(int num) { passageiros = num; }

    int get_pass() { return passageiros; }

    };

    class caminhao : public veiculo_rodoviario // Define um caminhao.

    {

    int carga;

    public:

    void set_carga(int size) { carga = size; }

    int get_carga() { return carga; }

    void mostrar();

    };

    enum tipo {car, van, vagao};

    class automovel : public veiculo_rodoviario // Define um automovel.

    {

    enum tipo car_tipo;

    public:

    void set_tipo(tipo t) { car_tipo = t; }

    enum tipo get_tipo() { return car_tipo; }

    void mostrar();

    };

    void caminhao::mostrar()

    {

    cout

  • Herana 108

    t1.set_rodas(18);

    t1.set_pass(2);

    t1.set_carga(3200);

    t2.set_rodas(6);

    t2.set_pass(3);

    t2.set_carga(1200);

    t1.mostrar();

    cout

  • Herana 109

    Classe base herdada como public:

    Membros pblicos (public) da classe base: como se copissemos os membros da classe base e os colocssemos como "public" na classe derivada. No

    final, eles permanecem como pblicos.

    Membros privados (private) da classe base: Os membros esto presentes na classe, porm ocultos como privados. Desta forma as informaes esto

    presentes, mas s podem ser acessadas atravs de funes publicas ou protegidas da classe base.

    Membros protegidos (protected) da classe base: Se tivermos membros protegidos (protected) na classe derivada, eles se comportam como se tivessem sido

    copiados para a classe derivada como protegidos (protected).

    Classe base herdada como private:

    Membros pblicos (public) da classe base: Os membros se comportam como se tivessem sido copiados como privados (private) na classe derivada.

    Membros privados (private) da classe base: Os membros esto presentes na classe, porm ocultos como privados. Desta forma as informaes esto

    presentes, mas no podero ser acessadas, a no ser por funes da classe base que se utilizem delas.

    Membros protegidos (protected) da classe base: Os membros se comportam como se tivessem sido copiados como privados (private) na classe derivada.

    Classe base herdada como Protected:

    Membros pblicos (public) da clase base: Se comportam como se tivssemos copiado-os como protegidos (protected) na classe derivada

    Membros privados (private) da classe base: Os membros esto presentes na classe, porm ocultos como privados. Desta forma as informaes esto

    presentes, mas no podero ser acessadas, a no ser por funes da classe base que se utilizem delas.

    Membros protegidos (protected) da classe base: Se comportam como se estivssemos copiado-os como protegidos (protected) na classe derivada.

    Em suma, estas regras podem ser sintetizadas em uma regra muito simples: Prevalece o atributo mais restritivo. Paraisto basta-nos listar os atributos por ordem de restries decrescente:1.1. private2.2. protected3.3. publicAssim, temos todas as combinaes definidas quando colocamos um atributo combinado com o outro, bastando paraisto escolher sempre o mais restritivo na combinao. Por exemplo: Quando temos uma varivel pblica na base e aherana privada, a combinao resulta em uma varivel privada na classe derivada.Aqui est um exemplo muito simples:

  • Herana 110

    #include

    using namespace std;

    class base

    {

    int i, j;

    public:

    void set(int a, int b) { i = a; j = b; }

    void show() { cout

  • Herana 111

    {

    int k;

    public:

    derived(int x) { k = x; }

    void showk() { cout

  • Herana 112

    classes.

    {

    public:

    void set(int i, int j) { x = i; y = j; }

    };

    int main()

    {

    derived ob;

    ob.set(10, 20); // Disponvel pela classe "derived"

    ob.showx(); // Pela classe base1

    ob.showy(); // Pela classe base2

    #ifndef WIN32

    system ("pause");

    #endif

    return 0;

    }

    Repare que utilizamos o operador vrgula para dizer ao compilador que a classe derivada herda mais de uma classe.Com efeito, temos uma lista de classes separadas por vrgulas depois do operador ":" (dois pontos).Quando queremos que a classe derivada herde uma classe como pblica e outra como privada ou protegida bastapreceder a classe com o seu especificador de acesso. Da mesma forma, a omisso do especificador leva o compiladora usar o padro que privado (private).

    Construtores e destrutoresTemos uma srie de classes que mantm relaes de parentesco conforme mostramos nas sees anteriores. Emtermos genricos, classes que herdam caractersticas de uma base precisam de regras claras quando forem criadas edestrudas. Precisamos definir a sequncia em que os construtores e destrutores sero chamados, uma vez que cadaclasse tem pelo menos um construtor e um destrutor.Agora temos a questo: Quando que os construtores so chamados quando eles so herdados? Quando um objeto da classe derivada instanciado, o construtor da classe base chamado primeiro seguido do

    construtor das classes derivadas, em sequncia da base at a ltima classe derivada. Quando o objeto da classe derivada destrudo, o seu destrutor chamado primeiro seguido dos destrutores das

    outras classes derivadas logo abaixo, em sequncia at a base.Vamos testar e ver como isto funciona.No caso em que termos herana sequencial A-B-C, teremos:

    #include

    using namespace std;

    class base

    {

    public:

    base() { cout

  • Herana 113

    class derivada1 : public base

    {

    public:

    derivada1() { cout

  • Herana 114

    ~derivada() { cout

  • Herana 115

    protected:

    int i;

    public:

    base(int x) { i = x; cout

  • Herana 116

    public:

    base2(int x) { k = x; cout

  • Herana 117

    {

    public:

    void comer();

    void mover();

    void dormir() { cout

  • Herana 118

    Acessando funes superpostas da classe baseO mecanismo para obter acesso s classes base a partir da classe derivada intuitivo. Para isto usamos o operador deresoluo de escopo, composto por um par de dois pontos "::", usando a seguinte sintaxe:

    ::(lista_de_parmetros);

    Ou seja, basta invocar a funo informando qual a verso especfica que se deseja utilizar. Se tivermos uma classe"A" e outra "B" com uma funo "Print()", por exemplo, e quisermos usar a funo "Print()" da classe "B" fazemos:

    B::Print();

    Talvez seja melhor visualizar um exemplo no cdigo mais completo:

    class B

    {

    public:

    void Print()

    {

    cout

  • Polimorfismo 119

    Polimorfismo

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    ConceitoPolimorfismo em linguagens orientadas a objeto, a capacidade de objetos se comportarem de forma diferenciadaem face de suas caractersticas ou do ambiente ao qual estejam submetidos, mesmo quando executando ao quedetenha, semanticamente, a mesma designao.O polimorfismo em C++ se apresenta sob diversas formas diferentes, desde as mais simples, como funes commesmo nome e lista de parmetros diferentes, at as mais complexas como funes virtuais, cujas formas deexecuo so dependentes da classe a qual o objeto pertence e so identificadas em tempo de execuo.

    Funes virtuais#include

    using std::cout;

    using std::endl;

    class Base {

    public:

    // declarao da funo virtual

    virtual void Quem_VIRTUAL()

    {

    cout

  • Polimorfismo 120

    }

    };

    int main ()

    {

    Base *ptr_base;

    Derivada derivada;

    ptr_base = &derivada; // converso implcita permissvel

    ptr_base->Quem_VIRTUAL(); // chamada polimrfica (mostra:

    "Derivada")

    ptr_base->Quem_NAO_VIRTUAL(); // chamada comum, no-polimrfica

    (mostra: "Base")

    cout

  • Polimorfismo 121

    public:

    int sum;

    };

    int main()

    {

    derived3 ob;

    ob.i = 10; // Isto se torna ambguo; A qual "i" estamos nos

    referindo???

    ob.j = 20;

    ob.k = 30;

    ob.sum = ob.i + ob.j + ob.k;// "i" ambguo aqui, tambm

    cout

  • Polimorfismo 122

    class derived3 : public derived1, public derived2 /* "derived3" herda

    as bases "derived1" e "derived2". Isto significa que h duas cpias de

    bases em "derived3"! */

    {

    public:

    int sum;

    };

    int main()

    {

    derived3 ob;

    ob.derived1::i = 10; // escopo resolvido, usa o "i" em

    "derived1".

    ob.j = 20;

    ob.k = 30;

    ob.sum = ob.derived1::i + ob.j + ob.k; // escopo

    resolvido.

    cout

  • Polimorfismo 123

    int k;

    };

    class derived3 : public derived1, public derived2 /* derived3 inherits

    both derived1 and derived2. This time, there is only one copy of base

    class. */

    {

    public:

    int sum;

    };

    int main()

    {

    derived3 ob;

    ob.i = 10; // now unambiguous

    ob.j = 20;

    ob.k = 30;

    ob.sum = ob.i + ob.j + ob.k;// unambiguous

    cout

  • Friend 124

    Friend

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    O que Friend um atributo especial de acesso a classes. Com ele declaramos que uma funo fora de uma classe amiga damesma.Declarando que uma funo (externa classe) "friend" dentro de uma classe, permite que a funo (a amiga) possaler e manipular membros (variveis e funes membro) "private" - privados e "protected" - protegidos (e claro"public" - publicas, mas isso j era permitido antes de serem "friends").Considerando que o acesso a membros pode ser restrito para determinadas partes do cdigo, podemos adotar umapostura mais flexvel para funes que conhecemos como confiveis e evitar os inconvenientes da restrio amembros por cdigos que no provoquem problemas maiores a nossa estrutura da aplicao.

    Declarar funes "friend"O processo para fazer com que funes fora do escopo da classe tenham acesso a membros sem nenhuma restrio muito simples. Para isto apenas temos de colocar o prottipo da funo externa dentro da classe precedido da palavra"friend". Desta forma o compilador passa a ignorar os atributos de restrio de acesso da classe quando a funoacessa membros da mesma.Vamos ao exemplo:

    // friend functions

    #include

    using namespace std;

    class CRectangle

    {

    int width, height;

    public:

    void set_values (int, int);

    int area () {return (width * height);}

    friend CRectangle duplicate (CRectangle);

    };

    void CRectangle::set_values (int a, int b)

    {

    width = a;

    height = b;

    }

    CRectangle duplicate (CRectangle rectparam)

    {

    CRectangle rectres;

    rectres.width = rectparam.width*2;

    rectres.height = rectparam.height*2;

    return (rectres);

    }

  • Friend 125

    int main ()

    {

    CRectangle rect, rectb;

    rect.set_values (2,3);

    rectb = duplicate (rect);

    cout

  • Friend 126

    friend class CRectangle; //declaro friend class

    };

    void CRectangle::convert (CSquare a)

    {

    width = a.side;

    height = a.side;

    }

    int main ()

    {

    CSquare sqr;

    CRectangle rect;

    sqr.set_side(4);

    rect.convert(sqr);

    cout

  • Classes internas 127

    void setn(int inn);

    };

    Uma vez que criamos o prottipo de objeto dentro de outra classe podemos us-lo atravs do operador de resoluode escopo. Deveremos nos referir ao operador para acessar o corpo da primeira classe e depois o invocamosnovamente para alcanar a outra. Desta forma, poderamos us-la como exemplificado abaixo:

    data::idata ni;

    importante notar que objetos diferentes tero dados diferentes na regio da classe interna, isso impede que usemosdados da classe mais externa dentro das classes internas. Devido a esta caracterstica as funes dentro da classeinterna no podem acessar dados da classe mais externa, a menos que sejam estticos, o que no exige definio doobjeto a qual eles pertencem. Portanto, o uso de classes internas permite um isolamento de parte dos dados e proverum tratamento diferenciado para os mesmos.

    Sobrecarga de operadores

    Modificando operadoresA linguagem C++ possui os mesmos operadores presentes na linguagem C. Estes tm funes padronizadas ecomportamentos semelhantes a seus parentes diretos em C. Esta caracterstica a traz compatibilidade que umrequisito fundamental e adiciona uma nova funcionalidade chamada sobrecarga de operadores.Quando operamos tipos nativos da linguagem, fazemos com funes especficas predefinidas e padronizadas. Comopoderemos operar os nossos objetos que definimos com nossas classes? Simples: criamos as funcionalidades e asatribuimos a operadores j conhecidos, de forma a manter a idia bsica da operao embutida na simbologia.Ao definir novas funes para os operadores padro, na verdade no substituimos a sua funo, apenas adicionamosmais uma funo ao mesmo operador. Esta operao chamada de sobrecarga de operador. O nome parece umpouco fora do comum, mas apenas reflete o comportamento da linguagem quando esta lida com a definio de vriostratamentos para o mesmo identificador, que, neste caso, o smbolo do operador. Portanto, sobrecarga deoperador a definio de novas tarefas para o mesmo operador.

    Definindo novas operaesDigamos que temos uma classe chamada ponto, que define dois inteiros para um plano hipoteticamente definido.Este par de inteiros poder representar uma coordenada neste plano formado por pontos espaados um do outro. Sobestas condies, cada objeto desta classe ser uma coordenada neste plano:

    class ponto

    { int x,y;

    public:

    ponto(int a, int b)

    { x = a;

    y = b;

    }

    };

    Se quisermos operar estes objetos no teremos como faz-lo, pois no h meios de operar os objetos do tipo ponto.Nenhuma operao possivel, pois a linguagem no define como oper-los. Cabe ao programador dizer aocompilador como ele deve efetuar a operao do novo tipo criado.

  • Sobrecarga de operadores 128

    ponto p1(1,5),p2(3,4), Soma;

    Soma = p1 + p2;

    Ao tentar compilar este trecho de cdigo o compilador retornar um erro por no conhecer a maneira de como operareste tipo de dado. Como criamos o tipo de dado, precisamos definir como fazer a soma do mesmo. Podemos fazer aseguinte definio:

    class ponto

    { int x,y;

    public:

    ponto(int a, int b)

    { x = a;

    y = b;

    }

    ponto operator+(ponto p);

    };

    ponto ponto::operator+(ponto p)

    { int a,b;

    a = x + p.x;

    b = y + p.y;

    return ponto(a,b);

    }

    A sintaxe desta definio, muitas vezes causa confuso, mas poder ser facilmente entendida depois que tenhamosassimilado as idias bsicas por traz dela. Ela opera, aparentemente, apenas um dado de entrada, porm o operadordeve somar dois. Como isto possvel? Observando mais atentamente o cdigo poderemos entender:Verificamos que, no cdigo, nos referimos a x e y sem definir a qual objeto pertence. Acontece que a operao estocorrendo dentro de um dos objetos, aquele imediatamente antes do operador. Esta a primeira coisa a ter em mente:O operador "pertence" a um dos objetos que est sendo operado, sendo sempre aquele que o antecede. Com isso, sprecisamos declarar o segundo dado a operar.Podemos visualizar isto melhor, da seguinte forma:P3 = P1 + P2;Que pode ser entendido como a invocao da funo:P3 = P1.operator+( P2);Agora podemos entender como acontece a invocao da funo que define o operador. Observe que P1 contm ooperador que recebe P2, fazendo o clculo e devolvendo uma cpia do objeto resultante para P3. A sintaxe esconde omecanismo para tornar o cdigo mais simples de ser entendido quando tiver que ser lido.

  • Alocao dinmica de memria 129

    Alocao dinmica de memria

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    Alocao dinmica de memriaO compilador reserva espao na memria para todos os dados declarados explicitamente, mas se usarmos ponteirosprecisamos reservar o espao necessrio e colocar o endereo inicial nos mesmos. Para isto, podemos usar oendereo de uma varivel definida previamente ou reservar o espao necessrio no momento que precisemos. Esteespao que precisamos reservar em tempo de execuo chamada de memria alocada dinamicamente.Refere-se possibilidade de termos o nosso programa a correr e o utilizador ter de inserir dados e como tal nosabemos exatamente a quantidade de dados que o utilizador vai colocar, portanto temos de arranjar uma memriaque nos permita lidar com esta indeterminao quanto quantidade de dados inseridos.Este o caso em que no sabemos no momento da programao a quantidade de dados que devero ser inseridosmas o programa j est a correr. tentar responder a perguntas: quantas pessoas existem na tua turma? Quantasletras vamos escrever, etc. Em vez de estarmos a prever um limite superior para abarcar todas as situaes, temosesta possibilidade do dinmico. Alm de que colocar no momento da programao cria reserva de memria por isso,estaramos a reservar memria para um limite que possivelmente no iramos ter necessidade. O exemplo tpico disto os processadores de texto. em que no sabemos a quantidade de letras que o utilizador vai escrever.Vamos voltar a uma ponta solta num dos captulos anteriores, onde queramos fazer com que o utilizador dissessequantos elementos do array que se deveria utilizar. J dissemos antes que o declarador do n de elementos do arraytem de ser ou uma constante ou um literal, mas no pode ser uma varivel. Isso d erro. Aqui vai o exemplo desseerro:

    #include

    using namespace std;

    int main ()

    {

    int numTests;

    cout > numTests;

    int testScore[numTests];

    return 0;

    }

    A razo da exigncia de ter uma constante (ou literal) que vamos alocar memria para o array na altura dacompilao, e o compilador necessita de saber exatamente a quantidade de memria que deve reservar porm se avarivel o size declarator, o compilador no sabe quanta memria deve reservar para alocar a varivel, pois o seuvalor pode mudar.

  • Alocao dinmica de memria 130

    Operador newReformulando o exemplo anterior agora com dados dinmicos.

    #include

    using namespace std;

    int main ()

    {

    int numTests;

    cout > numTests;

    int * iPtr = new int[numTests]; //colocamos um ponteiro no

    inicio da memria dinmica

    for (int i = 0; i < numTests; i++)

    {

    cout

  • Alocao dinmica de memria 131

    Operador Delete - Memory LeakO tempo de vida de uma varivel criada dinamicamente o tempo de execuo do programa. Se um ponteiro apontapara uma varivel dinmica e fica out of scope, j no conseguiremos acessar essa memria criada dinamicamente.Fica indisponvel. A isso se chama Memory LeakExplicando: se alocamos memria dinamicamente dentro de uma funo usando um ponteiro local, quando a funotermina, o ponteiro ser destrudo, mas a memria mantm-se. Assim j no teramos maneira de chamar essamemria porque ela no tem nome! Apenas tnhamos o endereo que estava no ponteiro.Portanto, se realmente no necessitamos mais dos dados que esto nessa memria dinmica, em vez de eles estarema ocupar espao vamos apag-los! Necessitamos de libertar essa memria atravs do operador delete este operadorentrega ao sistema operacional a memria reservada dinamicamente.A sintaxe

    delete [] iPtr;

    Este delete operator no apaga o ponteiro mas sim a memria onde o ponteiro aponta.dynamic memory allocation funciona porque a memria no reservada no momento da compilao, mas antes naexecuo. Em vez de ser no STACK (compilao) a memria reservada no HEAP (execuo). O heap uma parteda memria que usada como memria temporria.Pergunta: onde que fica situado o Heap?Vamos explicar melhor todo este processo: pois isto tem de entrar na cabea!

    void myfunction()

    {

    int *pt;

    int av;

    pt = new int(1024);

    ....

    ....

    //No delete

    }

    int main()

    {

    while (some condition exists) // Pseudo-code

    {

    myfunction();

    }

    exit 0;

    }

    quando a funo myfunction chamada a varivel av criada no stack e quando a funo acaba a varivel retirada do stack. O mesmo acontece com o ponteiro pt, ele uma varivel local. ou seja quando a funo acaba oponteiro tambm termina e retirado do stack. Porm o objeto alocado dinamicamente ainda existe.E agora no conseguimos apagar esse objeto por que ele no tem nome e a nica maneira que tnhamos para saberonde ele estava era atravs do ponteiro que terminou quando termina a funo pois ele local.Ento medida que o programa continua a operar mais e mais memria ser perdida do Heap (free store). se oprograma continuar o tempo suficiente, deixaremos de ter memria disponvel e o programa deixar de operar.

  • Alocao dinmica de memria 132

    Retornando um ponteiro para uma varivel local #include

    using namespace std;

    char * setName();

    int main (void)

    {

    char* str = setName(); //ponteiros para a funo

    cout

  • Alocao dinmica de memria 133

    Returning a Pointer to a Dynamically Created VariableOutra alternative, talvez melhor

    #include

    using namespace std;

    char * setName();

    int main (void)

    {

    char* str= setName();

    cout

  • Alocao dinmica de memria 134

    ou se quisermos desta maneira

    int *buff = new int[1024];

    for (i = 0; i < 1024; i++)

    {

    buff[i] = 52; //Assigns 52 to each element;

    }

    para utilizar o delete em arrays

    delete[] pt;

    delete[] myBills;

    Dangling Pointers int *myPointer;

    myPointer = new int(10);

    cout

  • Alocao dinmica de memria 135

    Vamos ver um exemplo com o caso de nothrow

    // rememb-o-matic

    #include

    using namespace std;

    int main ()

    {

    int i,n,* p;

    cout > i;

    p= new (nothrow) int[i]; //crimos I variaveis na execuo

    if (p == 0)

    cout

  • Excees 136

    Excees

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    Uma exception um erro que ocorre em tempo de execuo. Podemos lidar com estes erros e criar rotinas paramuitos deles, o que nos permite automatizar muitos erros que antes teriam de ser emendados mo.

    Namespace

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    O propsito dos namespace localizar os identifiers (os nomes) por forma a evitar que haja apenas um, para evitarcolises. Por exemplo eu poderia criar uma funo com um determinado nome e depois vir a saber que esse mesmonome existia na biblioteca. E isto pode ocorrer bem freqentemente quando temos vrios programadorescontribuindo para o mesmo projeto e ainda mais quando se recorre a bibliotecas para usar cdigo criado por outros.O que o namespace permite continuar a termos o mesmo nome mas ir fazer a diferenciao pela deteco docontexto de aplicao para cada nome.

    Templates

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    Os templates permitem a criao de cdigo reusado, usando templates possvel criar funes e classes genricas.Assim o tipo de dados usadas pelas funes so parmetros. Podemos criar um template para soma, e depoisenviamos que tipo de dados queremos somar, podemos at utilizar a sobrecarga de operadores para tal fim.

    Funes genricas template ret-type func-name(parameter list)

    {

    // body of function

    }

    vamos dar o exemplo

    // Function template example.

    #include

    using namespace std;

    template void swapargs(X &a, X &b)// This is a function template.

    {

    X temp;

    temp = a;

    a = b;

  • Templates 137

    b = temp;

    }

    int main()

    {

    int i=10, j=20;

    double x=10.1, y=23.3;

    char a='x', b='z';

    cout

  • Templates 138

    }

    int main()

    {

    myfunc(10, "hi");

    myfunc(0.23, 10L);

    system ("pause");

    return 0;

    }

    Repare que temos dois tipos de dados diferentes na mesma funo.

    Sobrecarregando explicitamente uma funo genricaapesar de uma funo genrica poder ser overload automaticamente se necessrio, ns podemos explicitar. a issochamamos deexplicit specialization

    Containers list set unordered_set map unordered_map

    Compilao

    Esta pgina precisa ser reciclada (discuta).Ao melhor-la, voc estar ajudando o Wikilivros.

    Compilao o processo de "traduo" do programa escrito em uma linguagem de programao para um formato noqual o computador entenda. A compilao gera um ficheiro - arquivo em portugus brasileiro - binrio (executvel) apartir do cdigo fonte.

    A traduo do cdigo para o computadorEm C e C++ so 3 os programas usados para fazer a traduo do cdigo fonte (que so as linhas de cdigo que oprogramador escreve) num ficheiro executvel, que o computador pode executar:1.1. Preprocessor - pr-processador2.2. Compiler - compilador3.3. Linker

  • Compilao 139

    Pr-processadorEste um programa que busca no cdigo fonte no cdigo que escrevemos por diretivas que foram dirigidas aele, ou seja linhas iniciadas com #, assim o pr-processador sabe que aquela instruo dirigida para ele. Noexemplo tnhamos:

    #include

    Ento o pr-processador inclui ficheiros localizados no ficheiro iostream. Ento tnhamos o cdigo fonte que depois transformado num outro cdigo fonte de acordo com as diretivas pr-processadas.Essencialmente, o pr-processador um processador de macros para uma linguagem de alto nvel.[1]

    CompiladorCompilador um programa que pega cdigo fonte preprocessado e o traduz em instrues de linguagem de mquina,linguagem que o computador entende. Estas so guardadas num arquivo a parte, chamado de "object file" e tem aextenso .o ou .obj dependendo do compilador. Existem diferentes compiladores para diferentes linguagens deprogramao. Essa traduo feita se o cdigo estiver na linguagem que o compilador compilar. Existem regras deescrita e de gramtica. No caso de existir um erro de sintaxe, ento dar um erro de compilao.

    LinkerApesar do nosso "object file" ter as instrues em linguagem mquina, o computador ainda no poder correr comoum programa. A razo que necessrio outro cdigo da biblioteca, que o cdigo do run-time library, que paraas operaes comuns tipo a traduo o input do teclado ou a capacidade para interagir com hardware externo tipo omonitor para apresentar uma mensagem. Estas bibliotecas run-time costumam j estar instaladas com o sistemaoperacional, caso isso no acontea teremos de fazer o download delas.Ento o resultado da combinao do "object file" com as partes necessrias da biblioteca run-time fazem finalmentea criao de um ficheiro executvel com a extenso .exe

    Processo de compilaoEm primeiro lugar, vamos escrever um cdigo que est na linguagem C++ e vamos gravar esse cdigo todo numficheiro, que uma quantidade de memria no computador. Esse ficheiro fica com a terminao .CPP ou .CP ouC.. Chama-se a este conjunto de linhas que escrevemos de, cdigo fonte ou source code (pode ter a terminao .c,.cpp, e .cc - estas extenses dependem do compilador que se utiliza). Esse "source code" de alguma formacrptica e para algum que no saiba de c++ no entanto aquilo que neste momento chamamos de humam readableform.Para tornar o nosso source code num programa usamos um compilador que ir produzir um "object file". Esteficheiro tem normalmente a extenso. OBJ porm ainda no temos um programa executvel. Para isso vamos utilizaro linker. Uma das vantagens do c++ que usufrui de uma estrutura multi-file. A linguagem permite compilaoseparada, onde partes do programa total podem estar numa ou mais source files e estes podem ser compiladosindependentemente de cada um. A ideia que o processo de compilao produz files que depois podem ser linkedtogether usando um editor de link ou loads que o sistema provem.Os programas feitos em c++ so tipicamente ficheiros .OBJ ligados uns aos outros com uma ou mais libraries. Estasso uma coleo de linkable files que ns crimos ou que foram fornecidas (vm com o compilador ou compramos).Depois de se fazer este linking que obtemos o arquivo executvel. No Windows, ele tem terminao .exe. Assim,o sistema operacional reconhece o programa como independente.

  • Compilao 140

    Os compiladores atuais incluem tambm pr-compiladores, (ou pr-processadores) (antes eram softwareindependente, extra), estes pr-compiladores vo fazer alteraes ao cdigo fonte, que basicamente consistem emeliminar pedaos de cdigo que escrevemos, e/ou substituir pedaos de cdigo que escrevemos por outro(copy-paste), enfim, alterar o cdigo fonte por outro cdigo fonte. Depois que se compila.

    Referncias[1] http:/ / www. dca. fee. unicamp. br/ cursos/ EA876/ apostila/ HTML/ node150. html

    O pr-processador C

    Lista de Palavras Reservadas do C++Estas so as palavras reservadas do c++:

    alignas (since C++11) alignof (since C++11) and

    and_eq asm auto

    bitand bitor bool

    break case catch

    char char16_t (since C++11) char32_t (since C++11)

    class compl const

    constexpr (since C++11) const_cast continue

    decltype (since C++11) default delete

    do double dynamic_cast

    else enum explicit

    export extern false

    float for friend

    goto if inline

    int long mutable

    namespace new noexcept (since C++11)

    not not_eq nullptr (since C++11)

    operator or or_eq

    private protected public

    register reinterpret_cast return

    short signed sizeof

    static static_assert (since C++11) static_cast

    struct switch template

    this thread_local (since C++11) throw

    true try typedef

    typeid typename union

    unsigned using virtual

    void volatile wchar_t

    while xor xor_eq

  • Lista de Palavras Reservadas do C++ 141

    Maiores detalhes podem ser encontrados em: http:/ / en. cppreference. com/ w/ cpp/ keyword

    Lista de Sequncias de EscapeEstes so caracteres que so difceis de serem expressos de outra forma em um cdigo fonte. Todos eles soprecedidos de uma barra invertida. A Tabela 1 apresenta a lista de sequncias de escape.

    Controle/Caracter Sequncia de escape Valor ASCII

    Nulo (null) \0 00

    Campainha (bell) \a 07

    Retrocesso (backspace) \b 08

    Tabulao horizontal \t 09

    Nova linha (new line) \n 10

    Tabulao vertical \v 11

    Alimentao de folha (form feed) \f 12

    Retorno de carro (carriage return) \r 13

    Aspas (") \" 34

    Apstrofo (') \' 39

    Interrogao (?) \? 63

    Barra invertida (\) \\ 92

    Tabela 1 - Lista de Sequncias de Escape em C++

  • Tabela ASCII 142

    Tabela ASCIIPrograma que gera a tabela ASCII do C++ (programa escrito em c++). Nenhum dos 2 programas mostra a tabelainteira. O programa mostra alguns caracteres que o programa 2 no mostra. De modo geral, faltam alguns caracteres.

    Esta pgina um esboo de informtica. Ampliando-a voc ajudar a melhorar o Wikilivros.

    Programa 1#include

    #include

    using namespace std;

    int main()

    {

    //CARACTER " " (ENTER) = DECIMAL 10 HEXADECIMAL A;

    int s = -127;

    cout

  • Tabela ASCII 143

    printf("%c %3i\t%2X\t",x,x,x);

    printf("%c %3i\t%2X\t",x+32,x+32,x+32);

    printf("%c %3i\t%2X\t",x+64,x+64,x+64);

    printf("%c %3i\t%2X\n",x+96,x+96,x+96);

    }

    system ("PAUSE");

    return 0;

    }

    C++11Origem: Wikipdia, a enciclopdia livre.C++11, anteriormente conhecido por C++0x o novo padro para a linguagem de programao C++. Ele substitui oantigo padro do C++, o ISO/IEC 14882, que foi publicado em 1998 e atualizado em 2003. Estes predecessoresforam informalmente chamados C++98 e C++03. O novo padro incluir muitas adies ao ncleo da linguagem(sua implementao principal), e estender a biblioteca padro do C++, incluindo a maior parte da biblioteca dochamado C++ Technical Report 1 um documento que prope mudanas ao C++ com exceo das funesmatemticas especficas.Esse nome uma referncia ao ano no qual o padro ser lanado. O comit pretendia introduzir o novo padro em2009,1 a partir do que o ento chamado "C++0x" passaria a se chamar "C++09", o que significa que o documentodeveria estar pronto para a ratificao dos membros do comit at o final de 2008. Para cumprir o prazo, o comitdecidiu focar seus esforos nas solues introduzidas at 2006 e ignorar novas propostas.2 porm ele ficar prontoapenas em 2010.Linguagens de programao como o C++ utilizam um processo evolucionrio para desenvolverem suas definies.Tal processo inevitavelmente culmina em problemas de compatibilidade com cdigo pr-existente, o queocasionalmente aconteceu durante o processo de desenvolvimento do C++. Entretanto, de acordo com o annciofeito por Bjarne Stroustrup inventor da linguagem C++ e membro do comit o novo padro ser quasecompletamente compatvel com o padro atual.3Novas classes: std::array std::tuple std::foward_list std::unordered_set std::unordered_multiset std::unordered_map std::unordered_multimap Regular expressions library: http:/ / en. cppreference. com/ w/ cpp/ regex Atomic operations library: http:/ / en. cppreference. com/ w/ cpp/ atomic Thread support library: http:/ / en. cppreference. com/ w/ cpp/ thread

  • Fontes e Editores da Pgina 144

    Fontes e Editores da PginaObjetivo Fonte: https://pt.wikibooks.org/w/index.php?oldid=212683 Contribuidores: Contribuidor, Helder.wiki, Marcos Antnio Nunes de Moura, SallesNeto BR, Wbrito

    Por que C++? Fonte: https://pt.wikibooks.org/w/index.php?oldid=244119 Contribuidores: Abacaxi, Helder.wiki, Jorge Morais, Marcos Antnio Nunes de Moura, SallesNeto BR, Wbrito, 2edies annimas

    Diferenas entre C e C++ Fonte: https://pt.wikibooks.org/w/index.php?oldid=265805 Contribuidores: Abacaxi, Fabio Basso, Helder.wiki, Marcos Antnio Nunes de Moura, Master, Torneira,1 edies annimas

    Introduo Fonte: https://pt.wikibooks.org/w/index.php?oldid=267436 Contribuidores: Abacaxi, Helder.wiki, Mappim, Marcos Antnio Nunes de Moura, Rautopia, 4 edies annimas

    Al, Mundo! Fonte: https://pt.wikibooks.org/w/index.php?oldid=267384 Contribuidores: Abacaxi, Albmont, Carlosmacapuna, Daveiro, Edudobay, Focli, Helder.wiki, Jorge Morais,Marcelo-Silva, Marcos Antnio Nunes de Moura, Petrusz1, Rautopia, Renatofq, Sygmn, Wbrito, 20 edies annimas

    Variveis e constantes Fonte: https://pt.wikibooks.org/w/index.php?oldid=238714 Contribuidores: Jorge Morais, Marcos Antnio Nunes de Moura, Rautopia

    Ponteiros Fonte: https://pt.wikibooks.org/w/index.php?oldid=269171 Contribuidores: Abacaxi, Albmont, Jonathan Queiroz, Jorge Morais, Marcos Antnio Nunes de Moura, 5 ediesannimas

    Vetores Fonte: https://pt.wikibooks.org/w/index.php?oldid=267854 Contribuidores: Abacaxi, Daveiro, Edudobay, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes de Moura, Master,Raylton P. Sousa, Wbrito, 6 edies annimas

    Estruturas Fonte: https://pt.wikibooks.org/w/index.php?oldid=256735 Contribuidores: Abacaxi, Albmont, Marcos Antnio Nunes de Moura, 5 edies annimas

    Operadores Fonte: https://pt.wikibooks.org/w/index.php?oldid=244121 Contribuidores: Abacaxi, Marcos Antnio Nunes de Moura

    Deciso e controle de fluxo Fonte: https://pt.wikibooks.org/w/index.php?oldid=266793 Contribuidores: Abacaxi, Marcos Antnio Nunes de Moura, 11 edies annimas

    Estruturas de repetio Fonte: https://pt.wikibooks.org/w/index.php?oldid=266523 Contribuidores: Abacaxi, Diegobza, Helder.wiki, LlamaAl, Lucas Daltro, Marcos Antnio Nunes de Moura,1 edies annimas

    Funes Fonte: https://pt.wikibooks.org/w/index.php?oldid=249232 Contribuidores: Abacaxi, Jonas AGX, 2 edies annimas

    Referncias de dados Fonte: https://pt.wikibooks.org/w/index.php?oldid=239660 Contribuidores: Albmont, Marcos Antnio Nunes de Moura, Reder, 5 edies annimas

    Entrada e sada de dados Fonte: https://pt.wikibooks.org/w/index.php?oldid=266602 Contribuidores: Abacaxi, Albmont, Daveiro, Edudobay, Jeferson90, Jonathan Queiroz, Jorge Morais,Marcelo-Silva, Marcos Antnio Nunes de Moura, Torneira, Wbrito, 16 edies annimas

    Entrada e sada de dados 2 Fonte: https://pt.wikibooks.org/w/index.php?oldid=256748 Contribuidores: Abacaxi, Daveiro, Diego.g.a, Edudobay, Jorge Morais, Marcelo-Silva, Marcos AntnioNunes de Moura, Raylton P. Sousa, Wbrito, 19 edies annimas

    Manipulando strings Fonte: https://pt.wikibooks.org/w/index.php?oldid=264914 Contribuidores: Abacaxi, Albmont, Daveiro, Fabiobasso, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunesde Moura, Wbrito, 20 edies annimas

    Classes Fonte: https://pt.wikibooks.org/w/index.php?oldid=266994 Contribuidores: Abacaxi, Albmont, Daveiro, Hudsonkem, Jeferson90, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunesde Moura, Wbrito, 18 edies annimas

    Encapsulamento Fonte: https://pt.wikibooks.org/w/index.php?oldid=214125 Contribuidores: MGFE Jnior, Marcos Antnio Nunes de Moura, 2 edies annimas

    Herana Fonte: https://pt.wikibooks.org/w/index.php?oldid=214299 Contribuidores: Albmont, Daveiro, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes de Moura, Wbrito, 14 ediesannimas

    Polimorfismo Fonte: https://pt.wikibooks.org/w/index.php?oldid=265821 Contribuidores: Abacaxi, Daveiro, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes de Moura, Torneira, Wbrito,5 edies annimas

    Friend Fonte: https://pt.wikibooks.org/w/index.php?oldid=255619 Contribuidores: Abacaxi, Daveiro, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes de Moura, Wbrito, 8 ediesannimas

    Classes internas Fonte: https://pt.wikibooks.org/w/index.php?oldid=212708 Contribuidores: Marcos Antnio Nunes de Moura

    Sobrecarga de operadores Fonte: https://pt.wikibooks.org/w/index.php?oldid=231778 Contribuidores: Marcos Antnio Nunes de Moura, Raylton P. Sousa, 5 edies annimas

    Alocao dinmica de memria Fonte: https://pt.wikibooks.org/w/index.php?oldid=266992 Contribuidores: Abacaxi, Daveiro, Helder.wiki, Jorge Morais, Marcelo-Silva, Marcos AntnioNunes de Moura, Petrusz1, Wbrito, 14 edies annimas

    Excees Fonte: https://pt.wikibooks.org/w/index.php?oldid=203880 Contribuidores: Daveiro, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes de Moura, SallesNeto BR, Wbrito, 5edies annimas

    Namespace Fonte: https://pt.wikibooks.org/w/index.php?oldid=203888 Contribuidores: Daveiro, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes de Moura, Wbrito, 4 edies annimas

    Templates Fonte: https://pt.wikibooks.org/w/index.php?oldid=267395 Contribuidores: Abacaxi, Daveiro, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes de Moura, Wbrito, 8 ediesannimas

    Containers Fonte: https://pt.wikibooks.org/w/index.php?oldid=267423 Contribuidores: Abacaxi, 1 edies annimas

    Compilao Fonte: https://pt.wikibooks.org/w/index.php?oldid=266790 Contribuidores: Abacaxi, Daveiro, Edudobay, Jonas AGX, Jorge Morais, Marcelo-Silva, Marcos Antnio Nunes deMoura, Master, Renatofq, SallesNeto BR, Wbrito, 5 edies annimas

    Lista de Palavras Reservadas do C++ Fonte: https://pt.wikibooks.org/w/index.php?oldid=266289 Contribuidores: Abacaxi, Lucas Daltro, 1 edies annimas

    Lista de Sequncias de Escape Fonte: https://pt.wikibooks.org/w/index.php?oldid=253634 Contribuidores: Abacaxi, Yoroi

    Tabela ASCII Fonte: https://pt.wikibooks.org/w/index.php?oldid=265804 Contribuidores: Abacaxi, Helder.wiki, Torneira, 2 edies annimas

    C++11 Fonte: https://pt.wikibooks.org/w/index.php?oldid=267422 Contribuidores: Abacaxi, 1 edies annimas

  • Fontes, Licenas e Editores da Imagem 145

    Fontes, Licenas e Editores da ImagemImage:Nuvola apps konsole.png Fonte: https://pt.wikibooks.org/w/index.php?title=Ficheiro:Nuvola_apps_konsole.png Licena: GNU Lesser General Public License Contribuidores: Alno,AlphaxImage:Recycle001.svg Fonte: https://pt.wikibooks.org/w/index.php?title=Ficheiro:Recycle001.svg Licena: desconhecido Contribuidores: Users Cbuckley, Jpowell on en.wikipedia

  • Licena 146

    LicenaCreative Commons Attribution-Share Alike 3.0//creativecommons.org/licenses/by-sa/3.0/