Tutorial de C++ Portuges

download Tutorial de C++ Portuges

of 26

Transcript of Tutorial de C++ Portuges

  • 8/8/2019 Tutorial de C++ Portuges

    1/26

    Classes e Objectos

    Uma classe um tipo definido pelo programador que contm o molde, aespecificao para os objectos, tal como o tipo inteiro contm o molde para as variveisdeclaradas como inteiros. A classe envolve e/ou associa, funes e dados, controlando oacesso a estes, defin-la implica especificar os seus atributos ( dados ) e suas funesmembro ( cdigo ).

    ex:. Um programa que utiliza uma interface controladora de um motor elctricodefiniria a classe motor. Os atributos desta classe seriam: temperatura, velocidade,tenso aplicada. Estes seriam representados na classe por tipos como float ou long . Asfunes membro desta classe seriam funes para alterar a velocidade, ler a temperatura,etc.

    Especificar uma Classe

    Vamos supor um programa que controla um motor elctrico atravs de uma sadaserie. A velocidade do motor proporcional tenso aplicada, e esta proporcional aos

    bits que vo para sada serie que passam por um conversor digital analgico ( DAC ).

    Vamo - nos abstrair de todos estes detalhes por enquanto e modelar somente ainterface do motor como uma classe, a pergunta que funes e que dados membro deveter nossa classe, e que argumentos e valores de retorno devem ter essas funesmembro:

    Representao da velocidade

    A velocidade do motor ser representada por um atributo, inteiro (int).Usaremos o nmero de bits que precisarmos, caso o valor de bits necessrio no

    possa ser fornecido pelo tipo , usaremos ento o tipo long , isto depende do conversordigital analgico utilizado e do compilador.

    Representao da sada srie

    O motor precisa conhecer a sada serie, a sua ligao com o "motor do mundoreal". Vamos supor uma representao em hexadecimal do atributo endereo de portaserie, um possvel nome para o atributo: enderecomotor.

    Alterao do valor da velocidade

    Internamente o utilizador da classe motor pode desejar alterar a velocidade, cria-se ento a funo :

  • 8/8/2019 Tutorial de C++ Portuges

    2/26

    void altera_velocidade(int novav);O valor de retorno da funo void ( valor vazio ), poderia ser criado um valor

    de retorno (int) que indicasse se o valor de velocidade era permitido e foi alterado ouno era permitido e portanto no foi alterado.

    Mtodos ou Funes Membro

    O C++ permite que se acrescente funes de manipulao dastructnadeclarao, juntando tudo numa s entidade que uma classe. Essas funes membro

    podem ter sua declarao ( cabealho ) e implementao ( cdigo ) dentro dastructous o cabealho ( assinatura ) nastructe a implementao, cdigo, fora. Este exemploapresenta a primeira verso, o prximo a segunda verso ( implementao fora daclasse ). Essas funes compem a interface da classe. A terminologia usada paradesign-las bastante variada: funes membro, mtodos, etc. Quando uma funomembro chamada, diz - se que o objecto est a receber uma mensagem ( para executar

    uma aco ). Um programa simples para testes sobre funes membro seria o seguinte:Exemplo 1 :#include

  • 8/8/2019 Tutorial de C++ Portuges

    3/26

    1Comentrios: O programa define um objecto que serve como contador, aimplementao representa a contagem no atributo num que um nmero inteiro. Asfunes membro so simples:

    incrementa adiciona um ao contador em qualquer estado ecomeca inicializa a contagem a zero.

    Sintaxe: A sintaxe para declarao de funes membro dentro de uma classe a mesmasintaxe de declarao de funes comuns :

    tipoderetorno nomedafuncao(lista_de_argumentos) { /*codigo */ }. Adiferena que como a funo membro est definida na classe, ela ganha acesso directo aos dadosmembros, sem precisar usar o "ponto", exemplo um_objeto.dadomembro ; . Lembre-seque as chamadas de funes membro j se referem a um objecto especfico, embora elassejam definidas de uma forma geral para toda a classe.

    A sintaxe de chamada ou acesso funes membro semelhante a sintaxe de acesso aosdados membro com exceo dos parnteses que contm a lista de argumentos da funo,mesmo que a lista seja vazia eles devem estar presentes:

    umcontador.incrementa();. Primeiro insere-se o nome do objecto e depois achamada da funo, estes so separados por um ponto. Cuidado para no esquecer os

    parnteses nas chamadas de funes membro em programas futuros, este um errobastante comum.

    Exemplo 2 :#include

  • 8/8/2019 Tutorial de C++ Portuges

    4/26

    }};

    void main(){

    circulo ac; // * instanciao de um objecto circulo (criao)ac.x=0.0;ac.y=0.0;ac.raio=10.0;ac.mostra();ac.move(1.0,1.0);ac.mostra();ac.x=100.0;ac.mostra();

    }

    Resultado do programa:Raio:10X:0Y:0Raio:10X:1Y:1Raio:10X:100

    Y:1Comentrios: A funo membro move altera as coordenadas do objecto. O objecto temas coordenadas x e y somadas com os argumentos dessa funo membro. Nota que estafuno membro representa uma maneira mais segura, clara, elegante de alterar ascoordenadas do objecto do que acess-las directamente da seguinte forma: ac.x+=dx;.ac.y+=dy;. Lembre-se que ac.x+=dx uma abreviao para ac.x=ac.x+dx; .

    Como funcionam no compilador as chamadas de funes membro: possvel imaginar que as definies de funes membro ocupam um grande espao na

    representao interna dos objectos, mas lembre-se que elas so todas iguais para umaclasse, ento basta manter para cada classe uma tabela de funes membro que consultada no momento da chamada . Os objectos s precisam ter uma referncia paraesta tabela.

    Funes Membro que retornam um valor

    At agora s tnhamos visto funes membro com valor de retorno igual a void.

  • 8/8/2019 Tutorial de C++ Portuges

    5/26

    Uma funo membro, assim como uma funo comum, pode retornar qualquer tipo,inclusive os definidos pelo programador. Sendo assim, sua chamada no programa aplica- se a qualquer lugar onde se espera um tipo igual ou equivalente ao tipo do seu valor deretorno, seja numa lista de argumentos de outra funo , numa atribuio ou numoperador como o cout

  • 8/8/2019 Tutorial de C++ Portuges

    6/26

    Comentrios:Numa declarao de uma classe coloca - se normalmente a declaraodas funes membro depois da declarao dos atributos, porm podemos fazerintercalaes ou adoptar qualquer ordem que nos convenha.

    O programador no obrigado a implementar as funes membro dentro da declaraoda classe, basta defini-las e apresentar a implementao em separado segundo a sintaxe (compilvel ) descrita a seguir:

    Exemplo 4 :#include

  • 8/8/2019 Tutorial de C++ Portuges

    7/26

    {float raio;float x;float y;

    void inicializa(float ax,float by,float cr);void altera_raio(float a);float retorna_raio(void);void move(float dx,float dy);void mostra(void);

    };

    void circulo::inicializa(float ax,float by,float cr){

    x=ax;

    y=by;raio=cr;}

    void circulo::altera_raio(float a){

    raio=a;}

    float circulo::retorna_raio(void)

    {return raio;}

    void circulo::move(float dx,float dy){

    x+=dx;y+=dy;

    }

    void circulo::mostra(void){cout

  • 8/8/2019 Tutorial de C++ Portuges

    8/26

    {circulo ac;

    ac.inicializa(0.0,0.0,10.0);ac.mostra();ac.move(1.0,1.0);ac.mostra();ac.x=100.0;ac.altera_raio(12.0);ac.mostra();

    }

    Comentrios: Observe que a funo membro mostra chama a funo membrofloatretorna_raio( void ) que da mesma classe. Fica implcito da definio de mostra queretorna_raio() se aplica ao mesmo objecto instanciado que recebeu a chamada de

    mostra, ou seja, no necessrio usar o . na chamada de retorna_raio(). Em programasmaiores, chamadas aninhadas de funes membro so bastante comuns.

    Programao orientada a objectos e interfaces grficas com o utilizador: Existemlibraries de classes que permitem o programador C++ desenvolver aplicaes paraambientes como o Microsoft Windowsreg. de uma maneira bastante abstracta, este umexemplo claro de reuso de cdigo, afinal o programador no precisa saber de detalhes dainterface para programar nela.

    Resultado do programa:

    Raio:10X:0Y:0Raio:10X:1Y:1Raio:12.0X:100.0Y:1

    C++: As classes em C++ englobam os dados membros e as funes membros. Paraexecutar uma ao sobre o objecto ou relativa a este basta chamar uma funo membropara este: ac.mostra();

    A funo membro no precisa de muitos argumentos, porque prpria da classe eportanto ganha acesso aos dados membro do objecto para o qual ela foi associada:

    float circulo::retorna_raio(void)

  • 8/8/2019 Tutorial de C++ Portuges

    9/26

    {return raio; //tenho acesso direto a raio.

    }

    Segurana: Em C++ o programador pode aceder directamente os dados do tipo definidopelo usurio: ac.x=100.0.

    Veremos maneiras de proibir em C++ este tipo de acesso directo ao dado membro,deixando este ser modificado somente pelas funes membro. Isto nos garante maiorsegurana e liberdade pois podemos permitir ou no o acesso para cada dado membro deacordo com nossa vontade.

    Eficincia: Algum pode argumentar que programas que usam bastante chamadas defunes podem se tornar pouco eficientes e que poderia ser melhor aceder diretamenteos dados de um tipo definido pelo usurio ao envs de passar por todo o trabalho de

    cpia de argumentos, insero da funo no pilha, etc.Na verdade no se perde muito em eficincia, e alm disso muitas vezes no se desejapermitir sempre o acesso directo aos dados de um tipo definido pelo programador porrazes de segurana. Nesse sentido o C++ oferece um recurso que permite ganhos emsegurana sem perder muito em eficincia.

    Constructores

    Construtores so funes membro especiais chamadas pelo sistema no momento da

    criao de um objecto. Elas no possuem valor de retorno, porque voc no pode chamarum construtor para um objecto. Construtores representam uma oportunidade deinicializar de forma organizada os objectos; imagina se tu te esqueces de inicializarcorrectamente ou o fazes duas vezes, etc.

    Um construtor tem sempre o mesmo nome da classe e no pode ser chamado peloutilizador desta. Para uma classe stringo construtor teria a formastring(char* a); com oargumento char* especificado pelo programador. Ele seria chamado automaticamente nomomento da criao, declarao de umastring:

    string a("Texto"); //alocacao estatica implica na chamada do construtor

    a.mostra(); //chamada de metodos estatica.

    Existem variaes sobre o tema que veremos mais tarde: Sobrecarga de construtor,"copy constructor", como conseguir construtores virtuais ( avanado, no apresentadoneste texto ), construtor de corpo vazio.

  • 8/8/2019 Tutorial de C++ Portuges

    10/26

    O exemplo seguinte simples, semelhante aos anteriores, presta ateno na funomembro com o mesmo nome que a classe ( struct ), este o construtor:

    Exemplo 6 :#include

  • 8/8/2019 Tutorial de C++ Portuges

    11/26

    Resultado do programa:X:0 , Y:0X:1 , Y:1

    Comentrios:Nota que com a definio do construtor, s obrigado a passar osargumentos deste no momento da criao do objeto.

    Constructores e Agregao

    O programa exemplo deste tpico cria uma classe recta com dois dados membro daclasse ponto este exemplo o resultado do exerccio anterior, com um recurso a mais deC++. C++ permite que no construtor da classe recta, voc chame os construtores dosatributos da classe ponto, se no o fizeres o compilador acusar um erro, pois osatributos ponto possuem constructores e eles precisam ser chamados para que ainicializao se complete de modo correcto para o conjunto.

    Observa o cdigo do constructor da classe recta usado no exemplo:

    recta(float x1,float y1,float x2,float y2):p1(x1,y1),p2(x2,y2){

    //nada mais a fazer, os construtores de p1 e p2 ja foram chamados}

    p1(x1,y1) ep2(x2,y2) so as chamadas dos constructores da classe ponto, elas devemficar fora do corpo {} do constructor, nesta lista separada por vrgulas deves inicializar

    todos os atributos. Os tipos bsicos como int,float, etc podem ser inicializados nessalista.

    Por exemplo se a classe recta tivesse um atributo inteiro de nome identificao, a listapoderia ser da seguinte forma:

    reta(float x1,float y1,float x2,float y2):p1(x1,y1),p2(x2,y2),identificacao(10){

    //nada mais a fazer, os construtores de p1 e p2 ja foram chamados}

    seria como se identificao tivesse um constructor que tem como argumento o seu valor.ou

    recta(float x1,float y1,float x2,float y2):p1(x1,y1),p2(x2,y2){

    identificacao=10;//tambem pode, porque tipos bsicos (int) em C++ no so objectos

  • 8/8/2019 Tutorial de C++ Portuges

    12/26

    // portanto nao tem construtores}

    Vamos ao exemplo, que novamente semelhante aos anteriores, para que o leitor presteateno somente nas mudanas, que so os conceitos novos, sem ter que se esforarmuito para entender o programa:

    Exemplo 7 :#include

  • 8/8/2019 Tutorial de C++ Portuges

    13/26

    void recta::mostra(void){p1.mostra();p2.mostra();

    }

    void main(){

    recta r1(1.0,1.0,10.0,10.0); //instanciao da recta r1

    r1.mostra();}

    Resultado do programa:

    X:1 , Y:1X:10 , Y:10Destructores

    Anlogos aos constructores, os destructores tambm so funes membro chamadaspelo sistema, s que elas so chamadas quando o objecto sai de escopo ou em alocaodinmica, tem seu ponteiro desalocado, ambas ( construtor e destrutor ) no

    possuem valor de retorno.

    No se pode chamar o destructor, o que se faz fornecer ao compilador o cdigo a ser

    executado quando o objecto destrudo, apagado. Ao contrrio dos constructores, osdestructores no tem argumentos.

    Os destructores so muito teis para "limpar a casa" quando um objecto deixa de serusado, no escopo de uma funo em que foi criado, ou mesmo num bloco de cdigo.Quando usados em conjunto com alocao dinmica eles fornecem uma maneira muito

    prctica e segura de organizar o uso do "heap". A importncia dos destructores em C++ aumentada pela ausncia de "garbage collection" ou coleta automtica de lixo.

    A sintaxe do destructor simples, ele tambm tem o mesmo nome da classe s que

    precedido por ~ , ele no possui valor de retorno e o seu argumento voidsempre:~nomedaclasse(void) { /* Codigo do destrutor */ }

    O exemplo a seguir simples, porque melhorias e extenses sobre o tema destructoressero apresentadas ao longo do texto:

    Exemplo 8 ://destrutor de uma classe

  • 8/8/2019 Tutorial de C++ Portuges

    14/26

    #include

  • 8/8/2019 Tutorial de C++ Portuges

    15/26

    Segundos criado, instanciado como uma varivel deste bloco de cdigo, o valor inicialde segundos 10, para no confundir com o objecto j criado.Segundos incrementado atingindo o valor 11. O valor de segundos impresso na tela.Finalizamos o bloco de cdigo em que foi criado segundos, agora ele sai de escopo, apagado, mas antes o sistema chama automaticamente o destructor. Voltando ao blocode cdigo de main(), minutos novamente incrementado. Finalizamos main(), agora,todas as variveis declaradas em main() saem de escopo, mas antes o sistema chama osdestructores daquelas que os possuem.

    Encapsulamento com "Class"

    Encapsulamento, "data hiding". Neste tpico vamos falar das maneiras de restringir oacesso as declaraes de uma classe, isto feito em C++ atravs do uso das palavrasreservadaspublic,private eprotected.Friends tambm restringe o acesso a uma classe.

    No apresentaremos mais exemplos de classes declaradas comstruct. Tudo que foi feitoat agora pode ser feito com a palavra class ao envs destruct, incluindo pequenasmodificaes. Mas porque usar s class nesse tutorial? A diferena que os dadosmembro e funes membro de umastructso acessveis por "default" fora dastructenquanto que os atributos e mtodos de uma classe no so, acessveis fora dela (main)

    por "default".

    Ento como controlar o acesso de atributos e mtodos numa classe? Simples, atravs daspalavras reservadasprivate,public eprotected.

    Protected est relacionada com herana, por agora vamos focalizar a nossa ateno emprivate epublic que qualificam os dados membro e funes membro de uma classequanto ao tipo de acesso ( onde eles so visveis ) .Public,private eprotectedpodemser vistos como qualificadores, "specifiers".

    Para facilitar a explicao suponha a seguintes declaraes equivalentes de classes:

    1)class ponto {

    float x; //dados membro

    float y;

    public: //qualificador

    void inicializa(float a, float b) {x=a; y=b;}; //funcao membrovoid move(float dx, float dy) {x+=dx; y+=dy; };

    };

  • 8/8/2019 Tutorial de C++ Portuges

    16/26

    a declarao 1 equivale totalmente :

    2)

    class ponto {private:

    float x;float y;

    public:

    //qualificadorvoid inicializa(float a, float b) {x=a; y=b;};void move(float dx, float dy) {x+=dx; y+=dy; };

    };que equivale totalmente :

    3)

    struct ponto {private:

    //se eu nao colocar private eu perco o encapsulamento em struct.

    float x;float y;

    public:

    //qualificadorvoid inicializa(float a, float b) {x=a; y=b;};void move(float dx, float dy) {x+=dx; y+=dy; };

    };

    Fica fcil entender essas declaraes se pensares no seguinte: esses qualificadoresaplicam - se aos mtodos e atributos que vem aps eles, se houver ento um outroqualificador, teremos agora um novo tipo de acesso para os mtodos declarados

    posteriormente.

    Mas ento porque as declaraes so equivalentes? porque o qualificador private "default" para class, ou seja no especificares nada , at que se insira um qualificador,tudo o que for declarado numa classe private. J emstruct, o que default o

  • 8/8/2019 Tutorial de C++ Portuges

    17/26

    qualificadorpublic.

    Agora vamos entender o que private e o que public:

    Vamos supr que instanciaste ( criaste ) um objecto do tipo ponto em seu programa:

    ponto meu; //instanciao

    Segundo o uso de qualquer uma das definies da classe ponto dadas acima no podesescrever no teu programa:

    meu.x=5.0; //erro !

    ,como fazias antes, a no ser que x fosse declarado depois depublic na definio daclasse o que no ocorre aqui. Mas podes escrever x=5.0; na implementao ( dentro ) de

    um mtodo porque enquanto no for feito usode herana, porque uma funo membro tem acesso a tudo o que de sua classe, veja oprograma seguinte.

    Voc pode escrever: meu.move(5.0,5.0); ,porque a declarao ( move ) est na partepublic da classe. Aqui o leitor j percebe que podem existir funes membroprivatetambm, e estas s so acessveis dentro do cdigo da classe (outras funes membro).

    Atributos Private, Funes Membro Public

    Aplicar encapsulamento a classe ponto definida anteriormente.

    Exemplo 9 :#include

  • 8/8/2019 Tutorial de C++ Portuges

    18/26

    void main(){ponto ap; //instanciao

    ap.inicializa(0.0,0.0); //mtodos publicap.mostra(); //metodos public

    }

    Resultado do programa:X:0 , Y:0

    Comentrios: Este programa no deixa tirar o ponto de (0,0) a no ser que sejachamada inicializa novamente. Fica claro que agora, encapsulando x e y precisamos demais mtodos para que a classe no tenha a sua funcionalidade limitada.

    Novamente: escrever ap.x=10; em main um erro! Pois x est qualificada comoprivate.

    Um Dado Membro Public

    Este programa uma variante do anterior, a nica diferena que Y colocado na partepublic da definio da classe e acessado directamente. Alm disso fornecemos aqui afuno membro move, para que voc possa tirar o ponto do lugar.

    Exemplo 10 :

    #include

  • 8/8/2019 Tutorial de C++ Portuges

    19/26

    x=a;y=b;

    }

    void ponto::mostra(void){cout

  • 8/8/2019 Tutorial de C++ Portuges

    20/26

    {public: //daqui em diante tudo e acessivel.

    void inicializa(float a,float b);void mostra(void);

    private:

    float x; //sao ocultos por defaultfloat y; //sao ocultos por default

    };

    //Arquivo 2 , ponto.cpp , implementacao para a classe ponto.

    #include

  • 8/8/2019 Tutorial de C++ Portuges

    21/26

    Uma classe implementa um tipo abstrato de dados.So exemplos de tipos abstratos de dados:

    1) Uma rvore binria com as operaes usuais de insero, remoo, busca ...

    2)Uma representao para nmeros racionais (numerador, denominador) que possua asoperaes aritmticas bsicas e outras de converso de tipos.

    3)Uma representao para ngulos na forma (Graus, Minutos, Segundos). Tambm comas operaes relacionadas, bem como as operaes para converter para radianos, entreoutras.

    Tipo abstracto de dados um conceito muito importante em programao orientada aobjectos e por este motivo logo apresentado neste tutorial. Os exemplos seguintes sosimples devido ao facto de no podermos usar todos os recursos C++ por razes

    didcticas. Devido a esta importncia, medida em que formos introduzindo novosrecursos exemplificaremos tambm com aplicaes na implementao tipos abstratos dedados.

    TAD Fraco

    Tipo abstraxto de dados frao. Baseado no conceito de nmero racional do campo damatemtica. Algumas operaes no foram implementadas por serem semelhantes sexistentes. Por equanto no podemos fazer uso de recursos avanados como sobrecargade operador e templates.

    Resumo das operaes matemticas envolvidas:

    Simplificao de fraco: (a/b)=( (a/mdc(a,b)) / (b/mdc(a,b)) )Onde mdc(a,b) retorna o mximo divisor comum de ab.

    Soma de frao: (a/b)+(c/d)=( (a.d+c.b) / b.d ) simplificada.Multiplicao de frao: (a/b) * (c/d)= ( (a*c) / (b*d) ) simplificada.

    Igualdade: (a/b)== (c/d) se a*d == b*c.

    No igualdade: (a/b) != (c/d) se a*d b*c

    Maior ou igual que: (a/b)(c/d) se a*d b*c

    Tpicos abordados: Constructores em geral, destructores, tipo long, criando mtodos deconverso de tipos, mtodos chamando mtodos do mesmo objecto, operador % queretorna o resto da diviso de dois inteiros.

  • 8/8/2019 Tutorial de C++ Portuges

    22/26

    Exemplo 12 ://header file para o TAD fraco.

    //File easyfra.h

    long mdc(long n,long d); //maximo divisor comum metodo de Euclides.

    class fraccao {

    private:

    long num; //numeradorlong den; //denominador

    public:fraccao(long t,long m); //constructor comumvoid simplifica(void); //diviso pelo mdc~fraccao() { /* nao faz nada*/ } //No preciso fazer nada.

    //operaes matemticas bsicasfraccao soma (fracao j);fracao multiplicacao(fracao j);

    //operaes de comparaoint igual(fraccao t);int diferente(fraccao t);int maiorouigual(fracao t);

    //operaes de input outputvoid mostra(void); //exibe fraco no videovoid cria(void); //pergunta ao utilizador o valor da fraco

    //operaes de converso de tipos

    double convertedbl(void); //converte para doublelong convertelng(void); //converte para long};

    //implementao para a classe fraco.

    #include

  • 8/8/2019 Tutorial de C++ Portuges

    23/26

    long mdc(long n,long d) //maximo divisor comum

    //metodo de Euclides +- 300 anos AC.{

    if (n

  • 8/8/2019 Tutorial de C++ Portuges

    24/26

    int fraccao::igual(fraccao t){

    return ((num*t.den)==(den*t.num));//funcciona bem mesmo para no simplificada

    }

    int fraccao::diferente(fraccao t){

    return ((num*t.den)!=(den*t.num));}

    int fraccao::maiorouigual(fraccao t){

    return ((num*t.den)=(t.num*den));

    }void fraccao::mostra(void){

    cout

  • 8/8/2019 Tutorial de C++ Portuges

    25/26

    lng=num/den;return lng;

    }

    #include

  • 8/8/2019 Tutorial de C++ Portuges

    26/26

    fraco como argumento, como isso foi possvel no programa?

    Simples, a linguagem oferece para as classes que voc cria a cpia bit a bit. Cuidadocom o uso dessa cpia em conjunto com alocao dinmica, objectos podero ter cpiasiguais de ponteiros, ou seja compartilhar uso de posies na memria. De qualquerforma, em 0 explicaremos como redefinir esta cpia de modo a evitar situaesindesejveis como a cpia de ponteiros e explicaremos melhor os perigos de usar estetipo de cpia em conjunto com alocao dinmica.

    Resultado do programa: Entre com fraco a: Numerador:4Denominador:2

    (2/1) Entre com fraco b: Numerador:5Denominador:3

    (5/3)c de a+b:(11/3)a*b(10/3)a+b(11/3)a=b1a==b0a!=b1long(a) 2double(a) 2