A linguagem C++ A linguagem C++ C -> C++, Java vs. C++

Propaganda
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
Download