Вы находитесь на странице: 1из 123

Orientao a Objetos com Standard C++

Sandro Santos Andrade sandro.andrade@gmail.com

Sandro Santos Andrade

Objetivos

Apresentar as caractersticas, objetivos, vantagens e desvantagens da linguagem C++. Apresentar como os mecanismos da orientao a objetos so implementados no C++. Capacitar o aluno para o desenvolvimento produtivo de sistemas modernos utilizando o C++. ornecer uma base preparat!ria para a realizao do curso sobre "t# $ %&evelop.
Sandro Santos Andrade

Roteiro

'ntroduo. Criando e (sando Objetos. Construtores )*sicos do C+++,. Abstrao de &ados. Aspectos da Orientao a Objetos em C++. )reve 'ntroduo - Standard Template Library +S./,. )reve 'ntroduo ao "t#.

Sandro Santos Andrade

'ntroduo

Sandro Santos Andrade

Considera0es 'niciais

Como aprender C++ 1


oco nos conceitos e no em detal2es t3cnicos. &esenvolva os estilos de programao e tcnicas pr!prios do C++. O aprendizado 3 gradual. 4o 3 necess*rio aprender C antes. 5rati6ue +envolva7se em projetos j* e8istentes ou inicie seus pr!prios projetos,.

Sandro Santos Andrade

Notas 9ist!ricas

O C++ :oi inspirado nas linguagens C, )C5/, Simula7;<, Ada e Algol;=. O termo C++ surgiu em >?=@ +Rick Mascitti,. Am >?=< comeam os primeiros es:oros para padronizao. O padro internacionalmente aprovado surgiu em >??=.

Sandro Santos Andrade

Usos do C++

Am aplica0es 6ue re6uerem e:iciBncia em bai8o nvel. A8C drivers de dispositivo. Am aplica0es 6ue re6uerem manutenibilidade e :acilidade de e8tenso e testes. A8C sistemas de in:ormao.

CURIOSIDADEC o controle da central de tele:onia dos A(A 3 :eito em C++ e todas as c2amadas D=DD so roteadas por um programa em C++.

Am aplica0es com inter:ace gr*:ica de usu*rio.


Sandro Santos Andrade

Usos do C++

O C++ 3C

Simples o su:iciente para o ensino de conceitos b*sicos. Eealstico, e:iciente e :le8vel o su:iciente para demandas de projetos. &isponvel para uso em diversos ambientes de desenvolvimento e e8ecuo. Completa o su:iciente para ser utilizada no ensino de conceitos e t3cnicas avanadas. Comercial o su:iciente para ser utilizada em projetos no7acadBmicos.
Sandro Santos Andrade

Criando e (sando Objetos

Sandro Santos Andrade

O 5rocesso de Compilao
Pr-Processador Compilador Linker

5r37processadorC realiza processamentos te8tuais indicados pelas diretivas de compilao +e8C Finclude, Fde:ine,. CompiladorC realiza a trans:ormao do c!digo7 :onte +.cpp, em c!digo7objeto +.o,. LinkerC realiza a combinao de diversos c!digos7objeto em um programa e8ecut*vel.
Sandro Santos Andrade

O 5rocesso de Compilao

Compilao separadaC

&eclaraoC introduz um nome +identi:icador, ao compilador. &e:inioC cria uma vari*vel ou :uno, alocando espao para armazenamento. A8emplosC
Declarao Definio

int func !int" int#$ e%tern int a$

int func !int" int# & ''' ( int a$

Sandro Santos Andrade

O 5rocesso de Compilao

Compilao separadaC

Gais e8emplosC
)) Declaration * definition e%amples e%tern int i$ e%tern float f !float#$ float .$ float f !float a# & return a / '0$ ( int i$ int , !int %# & return % / $ ( )) Declaration +it,out definition )) -unction declaration )) Declaration * definition )) Definition

)) Definition )) Declaration * definition

Sandro Santos Andrade

O 5rocesso de Compilao

Compilao separadaC

'ncluindo headers +ar6uivos com declara0es,C


1include 2stdio',3 1include 5local',6 1include 2iostream3 1include 2cstdio3 )) Procure o header nos diret4rios do sistema )) Procura o header primeiro no diret4rio local )) Por 7uest8es de porta.ilidade na e%tenso do ar7ui9o )) Estilo C// para incluso de headers do C

(sando bibliotecasC

i, 'nclua os headers, ii, use as :un0es e vari*veis e iii, :aa a link7edio da biblioteca no e8ecut*vel.
Sandro Santos Andrade

Um 5rimeiro 5rograma em C++

)) Sa:ing ;ello +it, C// !;ello"cpp# 1include 2iostream3 using namespace std$ )) Stream declarations

int main !# & cout 22 <;ello" =orld> I am < 22 ? 22 < @oda:>< 22 endl$ (

Sandro Santos Andrade

Um 5rimeiro 5rograma em C++


Incluindo as declara8es e defini8es de o.Aetos do C//

)) Sa:ing ;ello +it, C// !;ello"cpp# 1include 2iostream3 using namespace std$ )) Stream declarations

int main !# & cout 22 <;ello" =orld> I am < 22 ? 22 < @oda:>< 22 endl$ (

Sandro Santos Andrade

Um 5rimeiro 5rograma em C++


Para uso a.re9iado das declara8es e defini8es do namespace std Incluindo as declara8es e defini8es de o.Aetos do C//

)) Sa:ing ;ello +it, C// !;ello"cpp# 1include 2iostream3 using namespace std$ )) Stream declarations

int main !# & cout 22 <;ello" =orld> I am < 22 ? 22 < @oda:>< 22 endl$ (

Sandro Santos Andrade

Um 5rimeiro 5rograma em C++


Para uso a.re9iado das declara8es e defini8es do namespace std Incluindo as declara8es e defini8es de o.Aetos do C//

)) Sa:ing ;ello +it, C// !;ello"cpp# 1include 2iostream3 using namespace std$ )) Stream declarations

int main !# & cout 22 <;ello" =orld> I am < 22 ? 22 < @oda:>< 22 endl$ (
UtiliBa o o.Aeto cout para e%i.it um array de caracteres na tela

Sandro Santos Andrade

Um 5rimeiro 5rograma em C++


Para uso a.re9iado das declara8es e defini8es do namespace std Incluindo as declara8es e defini8es de o.Aetos do C//

)) Sa:ing ;ello +it, C// !;ello"cpp# 1include 2iostream3 using namespace std$ )) Stream declarations

int main !# & cout 22 <;ello" =orld> I am < 22 ? 22 < @oda:>< 22 endl$ (
UtiliBa o o.Aeto cout para e%i.it um array de caracteres na tela

5ara compilarC
g// -o ;ello ;ello'cpp

Sandro Santos Andrade

Um )reve .our em C++

Gais e8emplos +manipuladores,C


)) Core streams features 1include 2iostream3 using namespace std$ int main !# & )) Specif:ing formats +it, manipulators !dec" oct" ,e%#D cout 22 <a num.er in decimalD < 22 dec 22 E 22 endl$ cout 22 <in octalD < 22 oct 22 E 22 endl$ cout 22 <in ,e%D < 22 ,e% 22 E 22 endl$ cout 22 <a floating-point num.erD < 22 F' G EH 22 endl$ cout 22 <non-printing c,ar !escape#D < 22 c,ar !IJ# 22 endl$ (

Sandro Santos Andrade

Um )reve .our em C++

Gais e8emplos +concatenao,C


)) C,aracter arra: concatenation 1include 2iostream3 using namespace std$ int main !# & cout 22 <@,is is far too long to put on a < <single line .ut it can .e .roKen up +it, < <no ill effectsLnas long as t,ere is no < <punctuation separating adAacent c,aracter < <arra:s'Ln<$ (

Sandro Santos Andrade

Um )reve .our em C++

Gais e8emplos +entrando dados,C


)) Con9erts decimal to octal and ,e% 1include 2iostream3 using namespace std$ int main !# & int num.er$ cout 22 <Enter a decimal num.erD <$ cin 33 num.er$ cout 22 <9alue in octal M 0< 22 oct 22 num.er 22 endl$ cout 22 <9alue in ,e% M 0%< 22 ,e% 22 num.er 22 endl$ (

Sandro Santos Andrade

Um )reve .our em C++

Gais e8emplos +usando strings,C


)) @,e .asics of t,e Standard C// string class 1include 2string3 1include 2iostream3 using namespace std$ int main !# & string s " sI$ string sF M <;ello" =orld'<$ string sG !<I am<#$ sI M <@oda:<$ s M sF / < < / sG$ s /M < ? <$ cout 22 s / sI / <>< 22 endl$ (

)) Empt: strings )) InitialiBed )) Also initialiBed )) Assigning to a string )) Com.ining strings )) Appending to a string

Sandro Santos Andrade

Um )reve .our em C++

Gais e8emplos +lendo e escrevendo ar6uivos,C


)) Cop: one file to anot,er" a line at a time 1include 2string3 1include 2fstream3 using namespace std$ int main !# & ifstream in !<Scop:'cpp<#$ ofstream out !<Scop:I'cpp<#$ string s$ +,ile !getline !in" s## out 22 s 22 <Ln<$ (

)) Open for reading )) Open for +riting )) Discards ne+line c,ar )) ''' must add it .acK

Sandro Santos Andrade

Um )reve .our em C++

Gais e8emplos +utilizando o vector,C


)) Cop: an entire file into a 9ector of string 1include 2string3 1include 2iostream3 1include 2fstream3 1include 29ector3 using namespace std$ int main !# & 9ector 2string3 9$ ifstream in !<-ill9ector'cpp<#$ string line$ +,ile !getline !in" line## 9'pus,N.acK !line#$ )) Add t,e line to t,e end )) Add line num.ers for !int i M 0$ i 2 9'siBe !#$ i//# cout 22 i 22 <D < 22 9OiP 22 endl$ (

Sandro Santos Andrade

Construtores )*sicos do C+++,

Sandro Santos Andrade

Construtores )*sicos do C+++,

A maioria desses construtores so 2erdados do C. &eclarando :un0esC


int f !9oid#$ int fI!#$ float fF!float" int" c,ar" dou.le#$ 9oid fG!9oid#$ c,ar cfunc!int i# & if!i MM 0# return RaR$ if!i MM # return RgR$ if!i MM E# return RBR$ return RcR$ ( )) Returns an int" taKes no arguments )) QiKe f !# in C// .ut not in Standard C> )) Returns a float )) @aKes no arguments" returns not,ing

Sandro Santos Andrade

Construtores )*sicos do C+++,

Controlando a e8ecuoC

O C++ possui todos os comandos de controle de e8ecuo do CC if-else, while, do-while, for, switch. O C++ de:ine um tipo +bool, e constantes +true e false, para valores booleanos. 4o C, o valor D 3 :also e 6ual6uer coisa di:erente de D 3 verdadeiro. A.A4HIOC compara0es so realizadas com o operador JJ. Construtores para loops podem ser alterados pelos comandos break e continue.

Sandro Santos Andrade

Construtores )*sicos do C+++,

OperadoresC

Auto incremento e decrementoC ++, 77 +pr3 e p!s :i8ados,. .ipos primitivosC char, int, float, double e bool. Aspeci:icadoresC long, short, signed e unsigned. So criados com o operador S. O endereo de uma vari*vel ou :uno pode ser obtido com o operador K.
Sandro Santos Andrade

.ipos de dadosC

5onteirosC

Construtores )*sicos do C+++,

A8emplo de ponteirosC
int Sip$ int Sipa" ip." ipc$ int Sipa" Sip." Sipc$ int a M GJ$ ipa M *a$ Sipa M 00$ 9oid f !intS p# & cout 22 <p M < 22 p 22 endl$ cout 22 <Sp M < 22 Sp 22 endl$ Sp M E$ cout 22 <p M < 22 p 22 endl$ ( int main !# & int % M GJ$ cout 22 <% M < 22 % 22 endl$ cout 22 <*% M < 22 *% 22 endl$ f !*%#$ cout 22 <% M < 22 % 22 endl$ (

Sandro Santos Andrade

Construtores )*sicos do C+++,

Ee:erBncias no C++C

orma adicional de passar um endereo para uma :uno +passagem por re:erBncia,. Lalores so passados para :un0es 6ue usam re:erBncias sem a necessidade do operador K. Ee:erBncias so utilizadas como vari*veis comuns, sem a necessidade do operador S.

Sandro Santos Andrade

Construtores )*sicos do C+++,

A8emplo de re:erBnciasC
1include 2iostream3 using namespace std$ 9oid f !int* r# & cout 22 <r M < 22 r 22 endl$ cout 22 <*r M < 22 *r 22 endl$ r M E$ cout 22 <r M < 22 r 22 endl$ ( int main !# & int % M GJ$ cou t 22 <% M < 22 % 22 endl$ cout 22 <*% M < 22 *% 22 endl$ f !%#$ ( cout 22 <% M < 22 % 22 endl$

)) QooKs liKe pass-.:-9alue" )) is actuall: pass .: reference

Sandro Santos Andrade

Construtores )*sicos do C+++,

AscoposC

Eegras de escopo in:ormam onde uma vari*vel 3 v*lida, onde ela 3 criada e onde 3 destruda. (m escopo de uma vari*vel se estende do ponto onde ela :oi de:inida at3 o M +:ec2a7c2aves, do par de c2aves mais pr!8imo da vari*vel.

Sandro Santos Andrade

Construtores )*sicos do C+++,

A8emplo de escoposC
)) ;o+ 9aria.les are scoped int main !# & int scp $ )) scp 9isi.le ,ere & )) scp still 9isi.le ,ere int scpI$ )) scpI 9isi.le ,ere & )) scp * scpI still 9isi.le ,ere int scpF$ )) scp " scpI * scpF 9isi.le ,ere ( )) 2-- scpF destro:ed ,ere )) scpF not a9aila.le ,ere )) scp * scpI still 9isi.le ,ere ( )) 2-- scpI destro:ed ,ere )) scpF * scpI not a9aila.le ,ere )) scp still 9isi.le ,ere ( )) 2-- scp destro:ed ,ere

Sandro Santos Andrade

Construtores )*sicos do C+++,

Outro e8emplo de escoposC


int main !# & & )) Tegin a ne+ scope int 7 M 0$ )) C re7uires definitions ,ere )) Define at point of use for !int i M 0$ i 2 00$ i//# & 7//$ )) 7 comes from a larger scope )) Definition at t,e end of t,e scope int p M I$ ( int p M $ )) A different p ( )) End scope containing 7 * outer p +,ile !!c,ar c M cin'get !## >M R7R# & )) ''' ( (

Sandro Santos Andrade

Construtores )*sicos do C+++,

ormas de armazenamento de vari*veisC


NlobaisC disponveis em todas as partes do programa. /ocaisC tamb3m c2amadas autom*ticas +a palavra reservada auto re:ora o :ato, mas no 3 necess*ria,. EegisterC torna o acesso - vari*vel o mais r*pido possvel +palavra reservada register,. Ast*ticas +caso >,C vari*veis 6ue no so destrudas no t3rmino do escopo +palavra reservada static,.
Sandro Santos Andrade

Construtores )*sicos do C+++,

ormas de armazenamento de vari*veisC


Ast*ticas +caso O,C vari*veis ou :un0es globais no disponveis :ora do ar6uivo onde :oram de:inidas. A8ternasC vari*veis e :un0es 6ue e8istem, mas sero de:inidas em outro ar6uivo ou mais abai8o no c!digo +palavra reservada extern,. Lol*teisC vari*veis 6ue no podem ser so:rer otimiza0es baseadas na sua PestabilidadeQ +palavra reservada volatile,.

Sandro Santos Andrade

Construtores )*sicos do C+++,

Constantes e literaisC

&eclaradas na :orma Pconst int 8 J >DRQ. A8emplosC


&ecimaisC #<, D, >>D>. OctaisC D>< +>S na base >D,. 9e8adecimaisC D8>:e +S>D na base OD,. 5onto :lutuanteC >e#, >.DDD>, #<.D, D.D, 7>.>S?e7<<, O.< , O.<:, @.>#>S>;/, @.>#>S>;l. CaracterC TAT, ToT, TUnT, TUtT, TUUT, TUrT, TUTT, TUQT, TU><T, TUD8::T.

Sandro Santos Andrade

Construtores )*sicos do C+++,

OperadoresC

AtribuioC J. Operadores matem*ticosC +, 7, $ +truncada se entre inteiros,, V, W, +J, 7J, $J, VJ. Operadores relacionaisC X, Y, XJ, YJ, JJ, ZJ. Operadores l!gicosC KK, [[. Operadores bit7a7bitC K, [, \, ], KJ, [J, \J, YY, XX, YYJ, XXJ. Operadores un*riosC Z, 7, +, ++, 77, K +endereo7de,, V e 7Y +dere:erBncia,, cast, new e delete.
Sandro Santos Andrade

Construtores )*sicos do C+++,

OperadoresC

Operador if-else tern*rioC

A8C Pint ma8 J +a Y b, 1 a C bRQ.

Operador , +vrgula,C separa e8press0es e produz o valor da ^ltima utilizada. Operador sizeofC in:orma o taman2o de mem!ria alocado para o item. OutrosC typedef, struct, enum, union, arrays, ponteiros para :uno.

Sandro Santos Andrade

Abstrao de &ados

Sandro Santos Andrade

Abstrao de &ados

)ibliotecas em C++ +com estilo C,C


)) ;eader file for a C-liKe li.rar: )) An arra:-liKe entit: created at runtime t:pedef struct CStas,@ag & int siBe$ )) SiBe of eac, space int 7uantit:$ )) Uum.er of storage spaces int ne%t$ )) Ue%t empt: space )) D:namicall: allocated arra: of .:tes unsigned c,arS storage$ ( CStas,$ 9oid initialiBe !CStas,S s" int siBe#$ 9oid cleanup !CStas,S s#$ int add !CStas,S s" const 9oidS element#$ 9oidS fetc, !CStas,S s" int inde%#$ int count !CStas,S s#$ 9oid inflate !CStas,S s" int increase#$

Sandro Santos Andrade

Abstrao de &ados

O 6ue 2* de errado com essa abordagem 1


O endereo da estrutura deve ser in:ormado em cada uso de :un0es de biblioteca. O mecanismo da biblioteca se mistura ao signi:icado das c2amadas -s :un0es. Con:litos de nomes de :un0es. 5or6ue no tornar essas :un0es membros de uma struct 1

Como remediar 1

Sandro Santos Andrade

Abstrao de &ados

)ibliotecas em C++ +com estilo C++,C


)) C-liKe li.rar: con9erted to C// struct Stas, & )) @,ere is no typedef int siBe$ )) SiBe of eac, space int 7uantit:$ )) Uum.er of storage spaces int ne%t$ )) Ue%t empt: space )) D:namicall: allocated arra: of .:tes unsigned c,arS storage$ )) -unctions> 9oid initialiBe !int siBe#$ 9oid cleanup !#$ int add !const 9oidS element#$ 9oidS fetc, !int inde%#$ int count !#$ 9oid inflate !int increase#$ ($

Sandro Santos Andrade

Abstrao de &ados

)ibliotecas em C++ +com estilo C++,C


)) C li.rar: con9erted to C// )) Declare structure and functions 1include <CppQi.',< )) Vuantit: of elements to add )) +,en increasing storage const int increment M 00$ )) Scope operator !DD# 9oid Stas,DDinitialiBe !int sB# & siBe M sB$ 7uantit: M 0$ storage M 0$ ne%t M 0$ ( '''

Sandro Santos Andrade

Abstrao de &ados

4o C++, structs podem conter :un0es, encapsulando caracterstica e comportamento. O 6ue 3 um objeto 1

(ma entidade limitada e independente, capaz de recordar e atuar. (m lugar onde dados podem ser armazenados e 6ue conten2a opera0es 6ue podem ser realizadas nesses dados. /inguagens Orientadas a Objetos _ )aseadas em Objetos.
Sandro Santos Andrade

Abstrao de &ados

.ipos Abstratos de &adosC

'G5OE.A4.AC a de:inio de structs e classes criam novos tipos.

A declarao e de:inio de structs e classes acontecem em dois ar6uivosC


eaderC in:ormam o 6uB a struct$classe :az. 4ecess*rio na compilao. &e implementaoC in:orman como a struct$classe :az o 6ue ela se prop0e a :azer. 4ecess*rio na link7 edio. Gudanas na implementao no re6uerem a recompilao do sistema.
Sandro Santos Andrade

Abstrao de &ados

Ar6uivos header devem vir protegidos com definesC


1ifndef ;EADERN-QAW 1define ;EADERN-QAW )) @:pe declaration ,ere 1endif )S ;EADERN-QAW S) --------------------------------------------------------)) Simple ,eader t,at pre9ents re-definition 1ifndef SICPQEN; 1define SICPQEN; struct Simple & int i"A"K$ initialiBe !# & i M A M K M 0$ ( ($ 1endif )S SICPQEN; S)

Sandro Santos Andrade

Abstrao de &ados

Eesoluo do escopo globalC


)) Wlo.al scope resolution int a$ 9oid f !# &( struct S & int a$ 9oid f !#$ ($ 9oid SDDf !# & DDf !#$ DDa//$ a--$ ( )) =ould .e recursi9e ot,er+ise> )) Select t,e glo.al a )) @,e a at struct scope

int main !# & S s$ f!#$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Ajustando alguns limitesC

Am 6ual6uer relacionamento 3 importante ter limites 6ue so respeitados por todos os envolvidos. Ao criar uma biblioteca estabelece7se um relacionamento com o programador7cliente 6ue utiliza a biblioteca.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Aspeci:icadores de acesso do C++C


5ublicC todas as declara0es dos membros 6ue seguem esto disponveis para todos. 5rivateC signi:ica 6ue ningu3m pode acessar o membro, e8ceto o criador do tipo, dentro de :un0es membros desse tipo. 5rotectedC atuam como o private, por3m concedendo acesso a structs derivadas.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Aspeci:icador friendC

Concede acesso a partir de :un0es 6ue no so membros da struct em 6uesto.


)) -riend allo+s special access )) Declaration !incomplete t:pe specification# struct X$ struct Y & 9oid f!XS#$ ($ struct X & pu.licD friend 9oid g!XS" int#$ friend 9oid YDDf!XS#$ friend struct Z$ ($ )) Definition )) Wlo.al friend )) Struct mem.er friend )) Entire struct is a friend

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

ClassesC

5alavra c2ave utilizada no Simula7;< para indicar um novo tipo de dado. So idBnticas -s struct, com a e8ceo de 6ue membros de classes por default so privados, ao passo 6ue em structs eles so p^blicos. ` um conceito :undamental da orientao a objetos.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de uma classe em C++C


)) Con9erted to use access control 1ifndef S@AS;N; 1define S@AS;N; class Stas, & int siBe$ )) SiBe of eac, space int 7uantit:$ )) Uum.er of storage spaces int ne%t$ )) Ue%t empt: space )) D:namicall: allocated arra: of .:tesD unsigned c,arS storage$ 9oid inflate !int increase#$ pu.licD 9oid initialiBe !int siBe#$ 9oid cleanup !#$ int add !9oidS element#$ 9oidS fetc, !int inde%#$ int count !#$ ($ 1endif )) S@AS;N;

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

'nicializao e limpezaC

Gel2oram a robustez de uma classe. Guitos bugs de programas em C so conse6uBncia da :alta de inicializao ou limpeza de vari*veis. 4o se pode esperar 6ue o programador se lembre de e8ecutar m3todos de inicializao. O construtor 3 uma :uno7membro automaticamente invocada no momento da criao do objeto. Construtores tBm o mesmo nome da classe.
Sandro Santos Andrade

O m3todo construtorC

Aspectos da Orientao a Objetos em C++

Considera0esC

Construtores podem receber argumentos.

A8C P.ree t +>O,RQ

Construtores e destrutores so tipos especiais de :un0esC eles no tBm tipo de retorno. &estrutores tBm o mesmo nome da classe, por3m so iniciados com o caracter [. &estrutores nunca tBm argumentos.

O m3todo destrutorC

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de um construtor e destrutorC


class @ree & int ,eig,t$ pu.licD @ree!int initial;eig,t#$ [@ree!#$ )) ''' ($ )) Constructor )) Destructor

int main!# & cout 22 <.efore opening .race< 22 endl$ & @ree t ! I#$ cout 22 <after @ree creation< 22 endl$ t'printsiBe !#$ t'gro+ !G#$ cout 22 <.efore closing .race< 22 endl$ ( cout 22 <after closing .race< 22 endl$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

'nicializao agregadaC
int aOEP M & " I" F" G" E ($ int aOEP M & " I" F" G" E" \ ($ int .O\P M &0($ int cOP M & " I" F" G ($ )) InicialiBao agregada )) Erro )) o com Bero e demais com 0 )) Auto contagem

for!int i M 0$ i 2 siBeof c ) siBeof Sc$ i//# )) Desco.erta do taman,o do array cOiP//$ class Z & int i" A$ pu.licD Z!int ii" int AA#$ 9oid print!#$ ($ Z BBOP M & Z! "I#" Z!F"G#" Z!E"\#" Z!J"?# ($ )) Definio da classe Z

)) InicialiBao agregada de o.Aetos Z

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Construtor defaultC

` a6uele 6ue pode ser c2amado sem argumentos. Se nen2um construtor 3 especi:icado na classe o compilador ir* criar o construtor default vazio.
struct Y & float f$ int i$ Y!int a#$ ($ Y :IOIP M & Y! # ($ Y :FOJP$ Y :G$

)) Construtor com um par]metro )) ERRO )) ERRO )) ERRO

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Sobrecarga de :unoC

(ma das caractersticas importantes em uma linguagem de programao 3 o uso conveniente de nomes. Gotivao para sobrecargaC

.ratar nuances sem adicionar novos nomes. &i:erentes implementa0es de construtores.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Sobrecarga de :unoC

Argumentos defaultC

Automaticamente enviado pelo compilador caso ele no esteja presenta na c2amada - :uno. Eeduz a implementao de novas sobrecargas.

4o 3 permitido a sobrecarga em :un0es 6ue di:erem somente no tipo de retorno.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de sobrecargaC
class Stas, & int siBe$ )) SiBe of eac, space int 7uantit:$ )) Uum.er of storage spaces int ne%t$ )) Ue%t empt: space unsigned c,arS storage$ 9oid inflate!int increase#$ pu.licD Stas, !int siBe#$ )) Zero 7uantit: Stas, !int siBe" int initVuantit:#$ ( Stas,DDStas, !int sB# & siBe M sB$ 7uantit: M 0$ ( Stas,DDStas, !int sB" int initVuantit:# & Stas, !sB#$ inflate!initVuantit:#$ ( ne%t M 0$ storage M 0$

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de argumentos defaultC


class Stas, & int siBe$ int 7uantit:$ int ne%t$ unsigned c,arS storage$ 9oid inflate!int increase#$ pu.licD Stas, !int siBe" int initVuantit: M 0#$ ( Stas,DDStas, !int sB" int initVuantit:# & Stas, !sB#$ inflate!initVuantit:#$ ( ''' )) Use Stas, A! 00#" T! 00" 0#$ )) SiBe of eac, space )) Uum.er of storage spaces )) Ue%t empt: space

)) Default argument

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Considera0esC

4o pode e8istir um argumento default seguido de um argumento no default. A partir do primeiro argumento default todos os demais tamb3m devem ser default. O valor default dos argumento s! aparecem na declarao +ar6uivos header,.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Argumentos e retorno de :un0esC


4o C++, argumentos devem ser pre:erencialmente declarados como re:erBncias constantes. Objetos tempor*rios so sempre re:erBncias constantes.
class X &($ X f !# & return X!#$ ( 9oid g !X*# &( 9oid gI !const X*# &( )) Return .: 9alue )) Pass .: non-const reference )) Pass .: const reference

int main !# & )) ErrorD const temporar: created .: f!# g !f!##$ )) O^D gI taKes a const reference gI!f!##$ (
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Objetos constantes e :un0es7membro constantesC

Constantes no7est*ticas dentro de classes so constantes durante o ciclo de vida de cada objeto. Objetos di:erentes podem conter di:erentes valores para a constantes. Assas constantes no podem ser inicializadas dentro da classe. Assas constantes tamb3m no podem ser inicializadas dentro do m3todo construtor, pois elas devem ser inicializadas na de:inio.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

/ista de inicializao de construtoresC


)) InitialiBing const in classes 1include 2iostream3 using namespace std$ class -red & const int siBe$ static const ma% M 00$ pu.licD -red !int sB#$ 9oid print !#$ ($ -redDD-red !int sB# D siBe !sB# & ( 9oid -redDDprint !# & cout 22 siBe 22 endl$ ( int main !# & -red a ! #" . !I#" c !F#$ a'print !#" .'print !#" c'print !#$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

The enum hackC

1include 2iostream3 using namespace std$ class Tunc, & enum & siBe M 000 ($ int i OsiBeP$ ($ int main !# & cout 22 <siBeof !Tunc,# M < 22 siBeof !Tunc,# 22 <" siBeof !iO 000P# M < 22 siBeof !intO 000P# 22 endl$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Objetos constantesC

So objetos cujo estado no muda durante seu ciclo de vida.


const int i M $ const Tlo. . !I#$

Como garantir isso 1


'mpedir dados p^blicos no 3 su:iciente. EespostaC permitindo somente a invocao de :un0es7membro constantes.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

un0es7membro constantesC

So a6uelas 6ue no alteram o estado do objeto e possuem a palavra reservada const na sua assinatura. un0es sem a palavra reservada const so consideradas potenciais alteradoras do estado do objeto. .entar invocar :un0es no7const a partir de um objeto const resulta em um erro. .entar alterar o estado do objeto a partir de uma :uno const resulta em um erro.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de :un0es7membro constantesC


class X & int i$ pu.licD X !int ii#$ int f !# const$ ($ XDDX !int ii# D i !ii# & ( int XDDf !# const & return i$ ( int main !# & X % ! 0#$ const X %I !I0#$ % 'f !#$ %I'f !#$ (

Se a :uno f!" tentar modi:icar i ou tentar c2amar uma :uno no7const ser* gerado um erro.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Gacros do C _ un0es inline do C++C


)) Cacro em C 1define -QOOR!%".# %3M._0D )) Inlines inside classes class Point & int i" A" K$ pu.licD Point !#D i !0#" A !0#" K !0# & ( Point !int ii" int AA" int KK# D i !ii#" A !AA#" K !KK# & ( 9oid print !const string* msg M <<# const & if !msg'siBe!# >M 0# cout 22 msg 22 endl$ cout 22 <i M < 22 i 22 <" < 22 <A M < 22 A 22 <" < 22 <K M < 22 K 22 endl$ ( ($ )) Print poderia tam.m ser definida comoD inline 9oid PointDDprint !const string* msg M <<# const & ''' (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++


un0es inline so e8pandidas no c!digo. (so tpicoC acessores e modi:icadoresC


class Rectangle & int +idt," ,eig,t$ pu.licD Rectangle !int + M 0" int , M 0# D +idt, !+#" ,eig,t !,# & ( int get=idt, !# const & return t,is-3+idt,$ ( 9oid set=idt, !int +idt,# & t,is-3+idt, M +idt,$ ( int get;eig,t !# const & return t,is-3,eig,t$ ( 9oid set;eig,t !int ,eigt,# & t,is-3,eig,t M ,eig,t$ ( ($ int main!# & Rectangle r ! H" GJ#$ )) C,ange +idt, * ,eig,t r'set;eig,t !I S r'get=idt, !##$ r'set=idt, !I S r'get;eig,t !##$ (

)) Read )) Set )) Read )) Set

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Atividades ocultas em construtores e destrutoresC


class Cem.er & int i" A" K$ pu.licD Cem.er !int % M 0# D i !%#" A !%#" K !%# & ( [Cem.er !# & cout 22 <[Cem.er< 22 endl$ ( ($ class =it,Cem.ers & Cem.er 7" r" s$ )) ;a9e constructors int i$ pu.licD =it,Cem.ers !int ii# D i !ii# & ( )) @ri9ial _ [=it,Cem.ers !# & cout 22 <[=it,Cem.ers< 22 endl$ ( ($ int main !# & =it,Cem.ers +m ! #$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Antretanto, sugere7se a compilao separadaC

)) Ar7ui9o Rectangle', class Rectangle & int +idt," ,eig,t$ pu.licD Rectangle !int + M 0" int , M 0#$ int get=idt, !# const$ 9oid set=idt, !int +#$ int get;eig,t !# const$ 9oid set;eig,t !int ,#$ ($

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Antretanto, sugere7se a compilao separadaC


)) Ar7ui9o Rectangle'cpp inline RectangleDDRectangle !int +" int ,# D +idt, !+#" ,eig,t !,# & ( inline int RectangleDDget=idt, !# const & return +idt,$ ( inline 9oid RectangleDDset=idt, !int +# & +idt, M +$ ( inline int RectangleDDget;eig,t !# const & return ,eig,t$ ( inline 9oid RectangleDDset;eig,t !int ,# & ,eig,t M ,$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

#amespacesC

(tilizado para colocar os seus membros em um espao distinto. Criando um namespace$


namespace C:Qi. & )) Declarations ( int main !# & (

&etal2esC

#amespaces podem ser anin2ados, no 3 necess*rio R ao :inal, namespaces podem ser PcontinuadosQ.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de namespaces continuadosC


)) ;eader ', 1ifndef ;EADER N; 1define ;EADER N; namespace C:Qi. & e%tern int %$ 9oid f!#$ )) ''' ( 1endif )) ;EADER N; )) ;eaderI', 1ifndef ;EADERIN; 1define ;EADERIN; 1include <;eader ',< )) Add more names to C:Qi. namespace C:Qi. & e%tern int :$ 9oid g!#$ )) ''' (

)) UO@ a redefinition>

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

(sando namespacesC
namespace X & class Y & static int i$ pu.licD 9oid f !#$ ($ class Z$ 9oid func !#$ ( int XDDYDDi M H$ class XDDZ & int u" 9" +$ pu.licD Z !int i#$ int g !#$ ($

XDDZDDZ !int i# & u M 9 M + M i$ ( int XDDZDDg !# & return u M 9 M + M 0$ ( 9oid XDDfunc !# & XDDZ a ! #$ a'g !#$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

O operador usingC
1ifndef UACESPACECA@;N; 1define UACESPACECA@;N; 1include <UamespaceInt',< namespace Cat, & using namespace Int$ Integer a" .$ Integer di9ide !Integer" Integer#$ )) ''' ( 1endif )) UACESPACECA@;N; 1include <UamespaceInt',< 9oid arit,metic !# & using namespace Int$ Integer %$ %'setSign !positi9e#$ using Cat,DDdi9ide$ Integer i M di9ide !G" I#$ ( int main !# & (

)) Direti9a using )) Declarao using

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

&iretrizes para passagem de parametrosC


5assar um parametro por valor re6uer a invocao de um construtor e um destrutor. 5assar um parametro por re:erBncia constante re6uer apenas copiar um endereo. Se uma :uno no modi:ica um argumento, este deve ser passado como re:erBncia constante.

Ee:erBncias constantesC

Ou seja, para tipos primitivos, estes no sero modi:icados e para objetos, m3todos no7const no sero invocados nem atributos p^blicos modi:icados.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de re:erBncias constantesC


)) Passing references as const 9oid f !int*# &( 9oid g !const int*# &( int main !# & f ! #$ g ! #$ ( )) Error

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

5assando e retornando objetos por valorC


)) A class t,at counts its o.Aects 1include 2fstream3 1include 2string3 using namespace std$ ofstream out !<;o+Can:'out<#$ class ;o+Can: & static int o.AectCount$ pu.licD ;o+Can: !# & o.AectCount//$ ( static 9oid print !const string* msg M <<# & if !msg'siBe !# >M 0# out 22 msg 22 <D <$ out 22 <o.AectCount M < 22 o.AectCount 22 endl$ ( [;o+Can: !# & o.AectCount--$ print !<[;o+Can: !#<#$ ( ($

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

5assando e retornando objetos por valorC


int ;o+Can:DDo.AectCount M 0$ )) Pass and return TY `AQUED ;o+Can: f !;o+Can: %# & %'print !<% argument inside f!#<#$ return %$ ( int main !# & ;o+Can: ,$ ;o+Can:DDprint !<after construction of ,<#$ ;o+Can: ,I M f !,#$ ;o+Can:DDprint !<after call to f !#<#$ ( after construction of ,D o.AectCount M % argument inside f !#D o.AectCount M [;o+Can: !#D o.AectCount M 0 after call to f !#D o.AectCount M 0 [;o+Can: !#D o.AectCount M [;o+Can: !#D o.AectCount M -I

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

"uando um objeto 3 passado como valor um novo objeto 3 criado a partir do parametro. 'sso tamb3m acontece ao retornar um objeto em uma :uno. 5or default, o compilador realiza essa criao atrav3s de c!pias bit a bit, sem a invocao do destrutor. 5ara tipos primitivos isso no 3 um problema, mas pode ser prejudicial para objetos com atributos est*ticos ou ponteiros como atributos.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

elizmente, o programador pode especi:icar a :uno a ser c2amada sempre 6ue se precisa criar um objeto a partir de outro do mesmo tipo. Assa :uno 3 o copy constructor. O copy constructor recebe como parametro uma re:erBncia constante para um objeto da mesma classe na 6ual ele est* presente.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de copy constructorC


)) @,e copy-constructor ''' class ;o+Can:I & string name$ )) O.Aect identifier static int o.AectCount$ pu.licD ;o+Can:I !const string* id M <<# D name !id# & //o.AectCount$ print !<;o+Can:I !#<#$ ( [;o+Can:I !# & --o.AectCount$ print !<[;o+Can:I!#<#$ ( )) @,e copy-constructor ;o+Can:I !const ;o+Can:I* ,# D name !,'name# & name /M < cop:<$ //o.AectCount$ print !<;o+Can:I !const ;o+Can:I*#<#$ ( '''

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de copy constructorC


int main !# & ;o+Can:I , !<,<#$ out 22 <Entering f !#< 22 endl$ ;o+Can:I ,I M f !,#$ ,I'print !<,I after call to f !#<#$ out 22 <Call f !#" no return 9alue< 22 endl$ f !,#$ out 22 <After call to f!#< 22 endl$ ( # [;o+Can:I!# I# , cop:D o.AectCount M I F# ,I after call to f!# G# , cop: cop:D o.AectCount M I E# Call f!#" no return 9alue \# ;o+Can:I!const ;o+Can:I*# J# , cop:D o.AectCount M F ?# % argument inside f!# H# , cop:D o.AectCount M F I0# Returning from f!# I # ;o+Can:I!const ;o+Can:I*# II# , cop: cop:D o.AectCount M G IF# [;o+Can:I!# IG# , cop:D o.AectCount M F IE# [;o+Can:I!# I\# , cop: cop:D o.AectCount M I IJ# After call to f!# I?# [;o+Can:I!# IH# , cop: cop:D o.AectCount M F0# [;o+Can:I!# F # ,D o.AectCount M 0

# ;o+Can:I!# I# ,D o.AectCount M F# Entering f!# G# ;o+Can:I!const ;o+Can:I*# E# , cop:D o.AectCount M I \# % argument inside f!# J# , cop:D o.AectCount M I ?# Returning from f!# H# ;o+Can:I!const ;o+Can:I*# 0# , cop: cop:D o.AectCount M F

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Considera0es sobre copy constructorsC

Caso ele no seja implementado, o copy constructor default ir* realizar c!pia bit a bit +atributo a atributo,. Caso o objeto conten2a outros objetos ser* utilizado o copy constructor de cada objeto +6uando disponvel, ou a c!pia bit a bit +caso contr*rio,. 5ode7se impedir a passagem de objetos por valor declarando seu copy constructor como privado.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Sobrecarga de operadoresC

Eepresentam uma outra :orma de realizar invoca0es :un0es. 5or3m, os argumentos no esto entre parBnteses e sim pr!8imos a operadores. O compilador saber* 6ual :uno invocar a depender do operador e parametro utilizados. O nome da :uno a ser c2amada 3 :ormado pela palavra reservada operator seguida do operador a ser sobrecarregado. &evem ser criados somente 6uando o seu uso :avorecer a escrita e legibilidade do c!digo.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de sobrecarga de operadoresC


1include 2iostream3 using namespace std$ class Integer & int i$ pu.licD Integer !int ii# D i !ii# &( const Integer operator/ !const Integer* r9# const & cout 22 <operator/< 22 endl$ return Integer !i / r9'i#$ ( Integer* operator/M !const Integer* r9# & cout 22 <operator/M< 22 endl$ i /M r9'i$ return St,is$ ( ($

int main !# & cout 22 <.uilt-in t:pesD< 22 endl$ int i M " A M I" K M F$ K /M i / A$ cout 22 <user-defined t:pesD< 22 endl$ Integer ii ! #" AA !I#" KK !F#$ KK /M ii / AA$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Operadores no7membrosC

Algumas vezes o operando do lado es6uerdo deve ser um objeto de outra classe +e8emploC XX e YY,. 4o podemos alterar as classes ostream e istream. SoluoC sobrecarga de operadores como :un0es friend.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de operadores no7membrosC


ostream* operator22 !ostream* os" const IntArra:* ia# & for !int A M 0$ A 2 ia'sB$ A//# & os 22 ia'iOAP$ if !A >M ia'sB - # os 22 <" <$ ( os 22 endl$ return os$ ( istream* operator33 !istream* is" IntArra:* ia# & for !int A M 0$ A 2 ia'sB$ A//# is 33 ia'iOAP$ return is$ (

class IntArra: & enum & sB M E ($ int iOsBP$ pu.licD IntArra: !# & memset !i" 0" sBSsiBeof !Si##$ ( int* operatorOP !int %# & re7uire !% 3M 0 ** % 2 sB" <IntArra:DDoperator OP out of range<#$ return iO%P$ ( friend ostream* operator22 !ostream* os" const IntArra:* ia#$ friend istream* operator33 !istream* is" IntArra:* ia#$ ($

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de uso de operadores no7membrosC


int main!# & stringstream input!<GJ FG E\ HI 0F<#$ IntArra: I$ input 33 I$ IOGP M - $ )) Use o9erloaded operatorOP cout 22 I$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

%opy constructor _ Sobrecarga do operador de atribuioC

C:@:pe .$ C:@:pe a M .$ a M .$

)) O cop: constructor in9ocado' )) O operatorM in9ocado'

` sempre mel2or escrever c!digo 6ue usa o copy constructor ao inv3s do operator&, pois evita7se uma c2amada a :uno.
Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de operador de atribuioC

class `alue & int a" .$ float c$ pu.licD `alue !int aa M 0" int .. M 0" float cc M 0'0# D a !aa#" . !..#" c !cc# & ( `alue* operatorM !const `alue* r9# & a M r9'a$ . M r9'.$ c M r9'c$ return St,is$ ( friend ostream* operator22 !ostream* os" const `alue* r9# & return os 22 <a M < 22 r9'a 22 <" . M < 22 r9'. 22 <" c M < 22 r9'c$ ( ($

int main !# & `alue a" . ! " I" F'F#$ cout 22 <aD < 22 a 22 endl$ cout 22 <.D < 22 . 22 endl$ a M .$ cout 22 <a after assignmentD < 22 a 22 endl$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Considera0es sobre a sobrecarga do operador de atribuioC

So :re6uentemente utilizados para realizar deep copies em classes 6ue cont3m ponteiros como atributos. .oda classe possui um operator& 6ue realiza a atribuio bit a bit.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Criando objetos dinamicamenteC


class @ree & int ,eig,t$ pu.licD @ree !int tree;eig,t# D ,eig,t !tree;eig,t# & ( [@ree !# & stdDDcout 22 <S<$ ( friend stdDDostream* operator22 !stdDDostream* os" const @reeS t# & return os 22 <@ree ,eig,t isD < 22 t-3,eig,t 22 stdDDendl$ ( ($ 1endif )) @REEN; )) 1include <@ree',< using namespace std$ int main !# & @reeS t M ne+ @ree !G0#$ cout 22 t$ delete t$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

new and delete para arrabsC


C:@:peS fp M ne+ C:@:peO 00P$ C:@:peS fpI M ne+ C:@:pe$ delete fpI$ )) O^ delete fp$ )) Uot t,e desired effect delete OPfp$

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

9erana e composioC
1ifndef USE-UQN; 1define USE-UQN; class X & int i$ pu.licD X !# & i M 0$ ( 9oid set !int ii# & i M ii$ ( int read !# const & return i$ ( int permute !# & return i M i S GJ$ ( ($ 1endif )) USE-UQN; )) 1include <Useful',< class Y & int i$ pu.licD X %$ )) Em.edded o.Aect Y!# & i M 0$ ( ($ class Y D pu.lic X & int i$ )) Different from XRs i pu.licD Y!# & i M 0$ ( int c,ange!# & i M permute!#$ )) Different name call return i$ ( 9oid set!int ii# & i M ii$ XDDset!ii#$ )) Same-name function call ( ($ int main!# & Y D$ D'c,ange!#$ D'read!#$ D'permute!#$ D'set! I#$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

9eranaC

&urante a 2erana, por default tudo se trans:orma em private. A 2erana p^blica +$ public ', in:orma 6ue os membros p^blicos devero permanecer p^blicos na classe derivada. "uando um objeto 3 criado, os construtores default de todos os seus sub7objetos so c2amados. Como, entretanto, invocar outros construtores dos sub7objetos 1
Sandro Santos Andrade

ComposioC

Aspectos da Orientao a Objetos em C++

(tilizando a lista de inicializaoC


C:@:peDDC:@:pe!int i# D Tar!i# & )) ''' C:@:peIDDC:@:peI!int i# D Tar!i#" m!i/ # & )) ''' )) C:@:pe in,erits from Tar )) C:t:pe in,erits from Tar and aggregates m

` recomendado 6ue se utilize esse estilo de inicializao tamb3m para tipos primitivos.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

9erana e protectedC
class Tase & int i$ protectedD int read !# const & return i$ ( 9oid set !int ii# & i M ii$ ( pu.licD Tase !int ii M 0# D i !ii# &( int 9alue !int m# const & return mSi$ ( ($ class Deri9ed D pu.lic Tase & int A$ pu.licD Deri9ed !int AA M 0# D A !AA# &( 9oid c,ange !int %# & set!%#$ ( ($ int main!# & Deri9ed d$ d'c,ange ! 0#$ (

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

5olimor:ismo e :un0es virtuaisC


)) =ind o.Aects are Instruments )) .ecause t,e: ,a9e t,e same interface

)) In,eritance * upcasting 1include 2iostream3 using namespace std$ enum note & middleC" Cs,arp" Eflat ($ )) Etc' class Instrument & pu.licD 9oid pla: !note# const & cout 22 <InstrumentDDpla:< 22 endl$ ( ($

class =ind D pu.lic Instrument & pu.licD )) Redefine interface function 9oid pla: !note# const & cout 22 <=indDDpla:< 22 endl$ ( ($ 9oid tune !Instrument* i# & )) ''' i'pla: !middleC#$ ( int main !# & =ind flute$ tune !flute#$ (

)) Upcasting

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

)) In,eritance * upcasting 1include 2iostream3 using namespace std$ enum note & middleC" Cs,arp" Eflat ($ )) Etc'

a O

class Instrument & pu.licD 9oid pla: !note# const & cout 22 <InstrumentDDpla:< 22 endl$ ( ($

-U

C IO

)) =ind o.Aects are Instruments )) .ecause t,e: ,a9e t,e same interface class =ind D pu.lic Instrument & pu.licD )) Redefine interface function 9oid pla: !note# const & cout 22 <=indDDpla:< 22 endl$ ( ($ 9oid tune !Instrument* i# & )) ''' i'pla: !middleC#$ ( int main !# & =ind flute$ tune !flute#$ (

A
)) Upcasting
Sandro Santos Andrade

5olimor:ismo e :un0es virtuaisC

Aspectos da Orientao a Objetos em C++

5ara 2abilitar o late binding +ligao dinamica ou tardia, deve7seC


&eclarar as :un0es como virtual na classe base. (tilizar ponteiros ou re:erBncias no momento da invocao.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

5olimor:ismo e :un0es virtuaisC


)) =ind o.Aects are Instruments )) .ecause t,e: ,a9e t,e same interface

)) In,eritance * upcasting 1include 2iostream3 using namespace std$ enum note & middleC" Cs,arp" Eflat ($ )) Etc' class Instrument & pu.licD 9irtual 9oid pla: !note# const & cout 22 <InstrumentDDpla:< 22 endl$ ( ($

class =ind D pu.lic Instrument & pu.licD )) Redefine interface function 9oid pla: !note# const & cout 22 <=indDDpla:< 22 endl$ ( ($ 9oid tune !Instrument* i# & )) ''' i'pla: !middleC#$ ( int main !# & =ind flute$ tune !flute#$ (

)) Upcasting

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

5olimor:ismo e :un0es virtuaisC

)) In,eritance * upcasting

class Instrument & pu.licD 9irtual 9oid pla: !note# const & cout 22 <InstrumentDDpla:< 22 endl$ ( ($

1include 2iostream3 using namespace std$ enum note & middleC" Cs,arp" Eflat ($ )) Etc'

-U

C IO

)) =ind o.Aects are Instruments )) .ecause t,e: ,a9e t,e same interface class =ind D pu.lic Instrument & pu.licD )) Redefine interface function 9oid pla: !note# const & cout 22 <=indDDpla:< 22 endl$ ( ($ 9oid tune !Instrument* i# & )) ''' i'pla: !middleC#$ ( int main !# & =ind flute$ tune !flute#$ (

)) Upcasting

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Classes abstratas e :un0es virtuais purasC


(ma classe abstrata 3 a6uela 6ue cont3m pelo menos uma :uno virtual pura. un0es virtuais puras devem ser implementadas em classes :il2as, salvo estas tamb3m sejam abstratas. un0es virtuais puras no tBm corpo +de:inio,. Classes abstratas no podem ser instanciadas e servem somente para realizar upcast em m3todos com parametros polim!r:icos e ligao dinamica.

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de classe abstrataC

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo de classe abstrataC


)) Pure a.stract .ase classes class Instrument & pu.licD )) Pure 9irtual functionsD 9irtual 9oid pla: !note# const M 0$ 9irtual c,arS +,at !# const M 0$ )) Assume t,is +ill modif: t,e o.Aect 9irtual 9oid adAust !int# M 0$ ($ class =ind D pu.lic Instrument & pu.licD 9oid pla: !note# const & cout 22 <=indDDpla:< 22 endl$ ( c,arS +,at !# const & return <=ind<$ ( 9oid adAust !int# & ( ($

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

Considera0esC

Construtores no devem ser virtual. &estrutores devem ser virtual. dynamic)castC realiza o downcasting de :orma segura ou retorna um ponteiro nulo. Nera overhead e8tra. static)castC realiza o downcasting sem c2ecar por tipos. *verhead menor.

(owncastingC

Sandro Santos Andrade

Aspectos da Orientao a Objetos em C++

A8emplo downcastingC
class S,ape & pu.licD 9irtual [S,ape!# &($ ($ class Circle D pu.lic S,ape &($ class S7uare D pu.lic S,ape &($ class Ot,er &($ int main !# & Circle c$ S,apeS s M *c$ s M staticNcast2S,apeS3!*c#$ CircleS cp M 0$ S7uareS sp M 0$ if !t:peid !s# MM t:peid !cp## cp M staticNcast2CircleS3!s#$ if !t:peid !s# MM t:peid !sp## sp M staticNcast2S7uareS3!s#$ if !cp >M 0# cout 22 <ItRs a circle>< 22 endl$ if !sp >M 0# cout 22 <ItRs a s7uare>< 22 endl$ (

)) UpcastD normal and O^ )) Core e%plicit .ut unnecessar: )) C// R@@I

Sandro Santos Andrade

Introduo - Standard .emplate /ibrarb +S./,

Standard Template LibraryC


Conjunto de classes gen3ricas para estruturas de dados e algoritmos. )iblioteca importante para o uso e:etivo do C++. 5rincipais grupos de classesC

Strings 'OStreams Algoritmos gen3ricos Containers gen3ricos

Sandro Santos Andrade

Introduo - Standard .emplate /ibrarb +S./,

StringsC

G3todos para buscaC find+ find)first)of+ find)last)of+ rfind, G3todos para comparaoC operator&&+ operator-&+ operator.+ operator/+ operator.&+ operator/&+ compare,

Sandro Santos Andrade

Introduo - Standard .emplate /ibrarb +S./,

0*StreamsC

Neneralizam o acesso a diversas :ormas de '$O.

Sandro Santos Andrade

Introduo - Standard .emplate /ibrarb +S./,

%ontainers gen3ricosC
)) Simple use of S@Q set' 1include 2cassert3 1include 2set3 using namespace std$ int main !# & set2int3 intset$ for !int i M 0$ i 2 IE$ i//# for !int A M 0$ A 2 0$ A//# )) @r: to insert duplicates intset'insert !A#$ assert !intset'siBe!# MM 0#$ (

Sandro Santos Andrade

Introduo - Standard .emplate /ibrarb +S./,

%ontainers gen3ricosC

Se subdividem nas seguintes categoriasC


Containers de se6uBnciaC vector, list e de1ue. Containers adaptadoresC 1ueue, stack, priority)1ueue. Containers associativosC set, map, multiset, multimap.

Sandro Santos Andrade

Introduo - Standard .emplate /ibrarb +S./,

A8emplo de containers gen3ricosC


t:pedef stdDD9ector2S,apeS3 Container$ t:pedef ContainerDDiterator Iter$ int main !# & t:pedef stdDD9ector2S,apeS3 Container$ t:pedef ContainerDDiterator Iter$ Container s,apes$ s,apes'pus,N.acK !ne+ Circle#$ s,apes'pus,N.acK !ne+ S7uare#$ s,apes'pus,N.acK !ne+ @riangle#$ for !Iter i M s,apes'.egin !#$ i >M s,apes'end !#$ i//# !Si#-3dra+ !#$ )) ''' Sometime laterD for !Iter A M s,apes'.egin !#$ A >M s,apes'end !#$ A//# delete SA$ (

Sandro Santos Andrade

Introduo - Standard .emplate /ibrarb +S./,

A8emplo de algoritmos gen3ricosC

int main !# & int aOP M & " I" F" G" E" \" \" J" J" J" ?" ?" ?" ?" " " " const int ASZ M siBeof a ) siBeof Sa$ 9ector2int3 9 !a" a / ASZ#$ print !9'.egin !#" 9'end !#" <9<" < <#$ 9ector2int3DDiterator it M find !9'.egin !#" 9'end !#" G#$ cout 22 <findD < 22 Sit 22 endl$ '''

"

($

Sandro Santos Andrade

Introduo ao "t#

)iblioteca open source para construo de aplica0es visuais multiplata:orma. Cont3m e8tens0es paraC

#etworking, 5rocessamento de _G/. Gultimdia +*udio, vdeo e OpenN/,. Gultit2reading. 'nternacionalizao e localizao.

Sandro Santos Andrade

Introduo ao "t#

&emonstrao

Sandro Santos Andrade

Orientao a Objetos com Standard C++

-IC
sandro.andrade@gmail.com

Sandro Santos Andrade

Вам также может понравиться