13/11/15 AlinguagemC++ [ Curso Rápido de C++ ] • CriadaporBjarneStroustrupnoAT&TBellLaboratories (hojeBellLabs)em1979–1983; • AdicionacaracterísGcasOOàlinguagemC (“CwithClasses”->C++): – Classes,funçõesvirtuais,sobrescrita,herança múlGpla,templates,exceções,... • Tornou-sepadrãoISO/IECem1998 – versãomaiscomum:ISO/IEC14882:2011 (informalmenteC++11); – Versãomaisatual:ISO/IEC14882:2014,C++14 • Várioscompiladoresdisponíveis: – C++Builder,gcc,MinGW,TurboC++,VisualC++,... Desenvolvimento OO em C++ para quem já sabe C e Java Vítor E. Silva Souza ([email protected]) http://www.inf.ufes.br/~ vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Este obra foi licenciada sob uma Licença Creative Commons Atribuição 3.0 Não Adaptada. Janeiro2014 CursoRápidodeC++ AlinguagemC++ C->C++,Javavs.C++ • TotalcompaGbilidadecomC(qualquerprogramaemC éumprogramaC++); • BuscouideiasemSimula67eAlgol68: • Cpossuiumúnicomecanismodepassagemde parâmetros(porvalor): – Passagemdeponteirosésubterfúgiocomplexo; – C++resolveoproblema. • C++trazainda: – Classesevariáveis/funçõesmembros(atributos/ métodos); – Sobrecarga(maiscompletadoqueJava); – Herança(permiteherançamúlGpla); – Funçõesvirtuais(sobrescritademétodos); – Etc. 1950 Fortran Lisp Cobol 1960 Algol60 Simula67 1970 Smalltalk PL1 Algol68 Pascal Prolog C 1980 ML Ada Eiffel C++ CLOS 1990 Janeiro2014 Miranda CursoRápidodeC++ 4 Janeiro2014 CursoRápidodeC++ ComeçandocomC IncrementandoC:C++ • Programasimples,comoperaçõesaritméGcasem valoresnuméricos; • Problema:eprafazeromesmocomvaloresmuito grandes,quenãocabememintselongs? • C++permite: – Definirumaclasseparanúmerosgrandes; – ManterocódigobemparecidocomoprogramaC. • OmesmoprogramaemC(eatémesmoemJava)não sãotãoconvenienteseelegantes. #include <stdio.h> 5 #include "BigInt.h" main () { int a = 193; int b = 456; int c; c = a + b + 47; printf("%d\n",c); } Janeiro2014 3 main() { BigInt a = "25123654789456"; BigInt b = "456023398798362"; BigInt c; c = a + b + 47; c.print(); printf("\n"); } CursoRápidodeC++ 6 Janeiro2014 CursoRápidodeC++ 7 1 13/11/15 EnaespecificaçãodeBigInt... Destruiçãodeobjetos • AespecificaçãodeBigIntdevedizercomo: 1. CriarobjetosdaclasseBigInt(destrings!); 2. SomarBigIntxBigInteBigIntxint/long; 3. ImprimirumBigInt. • AindafaltaaoexemploadestruiçãodeobjetosBigInt desnecessários; • C++nãopossuicoletordelixocomoJava; • Porémasinstruçõesdecriação/destruiçãosãomais simplesdoquemalloc/free. #include "BigInt.h" main() { BigInt a = "25123654789456"; 1 BigInt b = "456023398798362"; BigInt c; c = a + b + 47; 2 c.print(); printf("\n"); 3 } Janeiro2014 CursoRápidodeC++ 8 Janeiro2014 CursoRápidodeC++ 9 Arquiteturadasoluçãoexemplo • SimilaresaosTADs; • Porémcomabstraçõesmaisadequadas. BigInt.cpp Compilador C++ BigInt.o Linker BigInt.h [CursoRápidodeC++] Client.cpp Compilador C++ DECLARANDOCLASSES(DEFINIÇÃO DAINTERFACE) Client.o Client.exe Janeiro2014 CursoRápidodeC++ 10 OarquivodedeclaraçõesBigInt.h(ou hpp)s Construtores Sobrescrita = e + void operator=(BigInt&); BigInt operator+(BigInt&); void print(FILE* f = stdout); ~BigInt() { delete digitos; } }; Janeiro2014 CursoRápidodeC++ 11 • Similaraoconceitodestructs/TADsemC,porém: – Construtores,sobrescrita,destrutores, especificadoresdeacesso,etc. • SimilaràdeclaraçãodeclassesemJava,porém: – Construtoresespeciais(cópiaedefault); – SobrescritadeoperadoresprimiGvos; – Destrutores(compararcomfinalize()Java?); – Especificadoresdeacesso/visibilidadeembloco; – Semespecificador:odefaultéprivate; – Implementaçãoemarquivoseparado. Atributos public: BigInt(char*); BigInt(unsigned n = 0); BigInt(BigInt&); CursoRápidodeC++ Declaraçãodeclasses #include <stdio.h> class BigInt { char* digitos; unsigned ndigitos; Janeiro2014 Impressão Destrutor 12 Janeiro2014 CursoRápidodeC++ 13 2 13/11/15 Sobrecarga ExplorandoaclasseBigInt • C++,assimcomoJava,permitesobrecarga(várias funçõescommesmonome); • EmBigInt,oexemploéoconstrutor; • ComoemJava: – Asfunçõesdevemterassinaturasdiferentes; – Paraassinatura,contaonomedafunçãoeosGpos dosparâmetros.OGpoderetornonãoconta; • Classessãosimilaresastructs; • BigIntpossuiumvetordechars(ponteiro)eum contadordonúmerodedígitos; • Onúmeroéarmazenadodetrásparafrente; – Ex.:oBigInt“654321”seria: digitos 1 2 3 4 5 6 6 ndigitos Janeiro2014 CursoRápidodeC++ 14 Janeiro2014 CursoRápidodeC++ 15 ExplorandoaclasseBigInt ExplorandoaclasseBigInt • Atributos(variáveismembro)privadas,métodos (funçõesmembro)públicas: • SobrecargacomoemJava:omesmonomeépermiGdo, desdequeosparâmetrossejamdiferentes: /* ... */ BigInt(char*) (construir) print() char*digitos intndigitos BigInt(BigInt&) (inicializar) BigInt(char*); BigInt(unsigned n = 0); BigInt(BigInt&); BigInta=“218” BigIntc=a+b+47; c.print(); /* ... */ operador+(BigInt&) (somar) Janeiro2014 CursoRápidodeC++ 16 Construtordefault Janeiro2014 CursoRápidodeC++ 17 ExplorandoaclasseBigInt • MesmaregradeJava: – Senenhumconstrutorédado,umconstrutordefault (semargumentos)éadicionadopeloC++; – Sealgumconstrutorfordado,oconstrutorsem argumentosnãoéadicionadoautomaGcamente; • EmBigInt,umdosconstrutoresservedeconstrutor default(semargumentos),poisseuargumentotem valordefault: • Funçõespodemterargumentosdefault: /* ... */ BigInt(unsigned n = 0); /* ... */ void print(FILE* f = stdout); /* ... */ /* ... */ • Seforemchamadassemargumento,ovalordefaulté uGlizado; BigInt(unsigned n = 0); /* ... */ Janeiro2014 CursoRápidodeC++ 18 Janeiro2014 CursoRápidodeC++ 19 3 13/11/15 Instânciasdiretaseponteiros Construtores • EmJava,instânciaseramsemprereferências (ponteiros).C++possuiosdoisGpos; • Osjáconhecidos.e->deCsãousadosparaacessar membrosdaclasse: • MaisversáteisqueJava // Chama o construtor default: BigInt (unsigned n = 0): BigInt a, vetor[10]; // Chama o mesmo construtor, só que especificando valor: BigInt b = 123; BigInt a = "25123654789456"; a.print(); // O mesmo construtor também é chamado para conversão: BigInt c = a + b + 47; BigInt* p; p = &a; p->print(); /* Acima, o construtor BigInt (BigInt&) também é acionado para criar um BigInt a partir de outro. */ // Chama o construtor BigInt (char*): BigInt d = "456"; BigInt e("789"); Janeiro2014 CursoRápidodeC++ 20 Janeiro2014 CursoRápidodeC++ 21 ConstrutordeCópia Sobrescrita • Oconstrutordecópiaéchamado(automaGcamente nãoexplicitamentepeloprogramadorquando): – Umobjetoépassadoporvalorparaumafunção – Umobjetoéretornadoporvalor – Umobjetoédeclaradoeinicializadocomumobjeto damesmaclasse • C++permitesobrescreverqualqueroperador,excetoo operadordeseleção(.)eaexpressãocondicional(?:); // Na classe BigInt: void operator=(BigInt&); BigInt operator+(BigInt&); // No cliente: BigInt a = "25123654789456"; BigInt b = "456023398798362"; BigInt c; c = a + b + 47; • Obviamente,odesenvolvedordeveimplementaros métodosoperator=eoperator+. Janeiro2014 CursoRápidodeC++ 22 Janeiro2014 CursoRápidodeC++ Destrutores Arquiteturadasoluçãoexemplo • EmC++,odesenvolvedordevedestruirasinstâncias quecriou,nãohácoletordelixo; – OC++irá,noentanto,destruirinstânciasdiretas criadasnapilha. • Portanto,destrutoressãosemprechamados(diferente doJava,quenãogaranteofinalize()); • Destrutoresdevemliberarmemóriadinâmicaalocada pelaclasseduranteaconstruçãodainstância. • OarquivoheaderestáOK! • Faltaagoraaimplementação. // No exemplo, o destrutor foi declarado e definido: ~BigInt() { delete digitos; } BigInt.cpp Compilador C++ 23 BigInt.o Linker BigInt.h Client.cpp Compilador C++ Client.o Client.exe // free() no C -> delete no C++. Janeiro2014 CursoRápidodeC++ 24 Janeiro2014 CursoRápidodeC++ 25 4