Você está na página 1de 30

Adere s Normas

C++11 e C++14

Vilmar Pedro Votre

Explicado
e aplicado

Rio de Janeiro, 2016

C++_CG.indd 3

20/04/2016 11:57:13

Sobre o autor

Vilmar Pedro Votre - terceiro filho de uma famlia de 10 irmos, nascido na Serra da
Pedra, municpio de Jacinto Machado Santa Catarina a meia encosta dos Aparados
da Serra, terra de minha me. Cresci em Ermo, hoje municpio, na bela vrzea Barriga
Verde, e que tem como um de seus encantos o pr do sol sobre os Aparados da Serra,
alm do belssimo rio de guas verdes afluente do rio Ararangu.
Cursei da sexta nona srie do ensino fundamental no Ginsio So Bento, dos
Irmos Maristas notrios professores na cidade de So Bento do Sul - SC. Fiz o
Cientfico e Cursinho pr-vestibular em Curitiba.
Cursei Engenharia Eletrnica no ITA em So Jos dos Campos e me dediquei principalmente ao ensino, talvez por herana marista. Fiz mestrado em Engenharia de Sistemas na COPPE da UFRJ Rio de Janeiro - e doutorado na Escola Politcnica da
Universidade de So Paulo, em So Paulo.
Fui professor da Universidade Presbiteriana Mackenzie, So Paulo, de 1991 a 2013,
tendo sido o Diretor da Faculdade de Computao e Informtica da instituio, de
2001 a 2007, boa parte do tempo tendo como Reitor o Prof. Dr. Cludio Lembo.
No final de 2012 deixei o Mackenzie e atualmente me dedico a um projeto pessoal
em Monteiro Lobato, no Bairro dos Souzas a volta ao p da serra - prximo a So Jos
dos Campos com parte significativa do tempo dedicado ao estudo de C++ e trabalho
neste livro. Lecionei Fsica para o nono ano do ensino fundamental no Instituto Pandavas em Monteiro Lobato durante o primeiro semestre de 2014.
Minhas reas de interesse atuais so IoT (Internet of Things) e o uso dessa em agricultura de preciso, com nfase irrigao por gotejamento, a que demanda menos
gua. Essa uma rea de aplicao de C++, em particular nas placas Arduino. Destaca-se
o dado de que apenas 5% da rea cultivada do Brasil irrigada mas coopera com 35%
da produo.

C++_CG.indd 5

20/04/2016 11:57:14

Agradecimentos

A Deus, que me tem dado muita sade e pacincia.


A meu pai, Pedro Josu Votre, na plenitude de seus 95 anos (em 2014), a quem nunca falta a capacidade de rir, de se emocionar, de trabalhar.
minha me, Docila Silva Votre j falecida que sabia ver em cada filho boas
qualidades e esquecia os defeitos e erros (seu grande medo, com certeza, era que, ainda
garotos nos afogssemos no rio, um enorme rio, de gua verde, afluente do Ararangu,
onde nadamos todas as tardes quentes, ainda que proibidos tinhas razo me! muitos
morrem em funo dos riscos que correm).

Dedicatria

Aos alunos da Faculdade de Computao e Informtica do Mackenzie, a quem lecionei


por tantos anos, inclusive como diretor da faculdade, e de quem guardo excelentes recordaes. Aos professores em quem sempre encontrei amigos colaboradores dedicados
e zelosos de seu trabalho, no perodo de direo.
A meus filhos Cristiano, Marcel e Mariana (in memorian) antes de tudo grandes amigos.
Ao Professor Doutor Pedro Ronzelli Jnior, Vicerreitor e depois Reitor do Mackenzie, em quem encontrei sobretudo um grande amigo na dura lida da busca da qualidade.

C++_CG.indd 7

20/04/2016 11:57:14

Introduo

Craig Bolon, autor do excelente livro de C - Mastering C compara a linguagem C


s ferramentas dos marceneiros: em mos hbeis, belas peas; em mo inbeis, sangue,
dedo cortado,
Outros dizem que a linguagem Pascal como uma arma com a qual voc no consegue
dar um tiro no prprio p, ao passo que a linguagem C como uma arma com a qual voc
consegue acertar o seu p. Perguntado se a linguagem C++ teria herdado essa indesejvel
propriedade, j que C++ tem por base a linguagem C, Bjarne Stroustrup, seu autor, afirmou: com C++ difcil dar o tiro no p, mas quando se consegue vai a perna inteira!
Programei C no final da dcada de 80, e a partir de 1992 passei a programar C++
penso que a grande diferena est no suporte a objetos, de C++. E o suporte a objetos
um recurso extremamente poderoso pois aumenta em muito o poder de representao.
Ao mesmo tempo torna o aprendizado uma tarefa muito mais longa pois h muito
mais conceitos e recursos para dominar. H quem afirme que C++ evolui a linguagem
C, que, alis, continua viva e gerando novos padres. Mas o correto dizer que C++
uma revoluo sobre a linguagem C.
Autor de uma edio independente C++ Explicado e Aplicado, de 1998 e ainda
diretor da Faculdade de Computao e Informtica do Mackenzie, em So Paulo, comecei
a pensar no texto para a nova norma, debatida mais vivamente a partir de 2007. Em 2003
o comit publicara um complemento da norma C++98. O nome de cdigo da nova norma
era C++0x, e era esperado que se tornasse norma at 2009, o valor mais alto esperado para
x. Mas entrou 2010, e chegou 2011 - alguns pilheriando que x era da base 16 e se poderia
ir at 2015 - mas em 2011 finalmente saiu o texto final da norma, da o C++11.
Entre o texto da norma e a implementao nos compiladores h ainda, sempre, um
rduo caminho (em jogo a volatilidade pois o que est em debate muda e bastante) e
com isso praticar com os novos recursos exige pacincia. Finalmente, em 2014, ou seja,
seis anos aps o contato com os novos recursos da linguagem, conclu o texto do livro,
que explica e aplica boa parte dos recursos da norma C++11. A norma, essa, continua
sendo o que j se falava da C++98, a cura da insnia, o que pode ser bom, em certos
casos, mas no para mim, que s tenho insnia quando bebo caf noite.
Quanto aos novos recursos o sentimento o melhor: vale a pena aprend-los: ponteiros inteligentes, suporte a concorrncia, lista iniciadora, deduo automtica de tipo,
range for e muitos mais que esto marcados ao longo do livro.

C++_CG.indd 1

20/04/2016 11:57:14

SUMRIO
CAPTULO 1

19

Conceitua Objetos e Apresenta C++

19
1.1 Completeza e complexidade computacional
19
1.2 Bases de Numerao e Base 2
20
1.2.1 Bases de numerao, formatos inteiro e de ponto flutuante 21
1.3 Distncia cognitiva e reso
25
1.4 Orientao a objetos Conceitos
27
1.4.1 Conceitos mais comuns sobre objetos segundo Bunge 29
1.5 Apresenta o modelo da linguagem C++
32
1.6 Traduz termos mais ou menos polmicos
33

CAPTULO 2

37

C++ Nvel 1

37
37
2.1.1 Programa bem formado 37
2.1.2 Efeitos observveis de um programa 37
2.1.3 Apresenta o contexto de C++ 38
2.2 Tipos C++
40
2.2.1 Tipos fundamentais 42
2.2.1.1 Tipo Int 42
2.2.1.2 Tipo ponto flutuante 43
2.2.1.3 Tipo caractere 44
2.2.1.4 Tipo booleano (bool) 45
2.2.2 Pe os tipos fundamentais para operar 45
2.3 Varivel C++
46
2.3.1 Nome de varivel 47
2.3.1.1 Varivel annima (temporria) 48
2.3.2 Durao em memria (storage duration) 48
2.3.2.1 Durao register (auto) 48
2.3.2.2 Durao static 48
2.3.2.3 Durao extern 49
2.3.2.4 Durao mutable 49
2.3.2.5 Tempo de vida dos objetos 49
2.3.3 Qualificador CV (const e volatile) 49

2.1. Elementos bsicos em C++

C++_CG.indd 3

20/04/2016 11:57:14

2.3.4 Alcance 50
2.3.4.1 Alcance bloco 51
2.3.4.2 Alcance funo
51
2.3.4.3 Alcance prottipo de funo 52

2.3.5 Visibilidade e operador de alcance 52


2.3.6 Varivel altervel ou no 52
2.3.7 Ligao 53
2.3.7.1 Ligao externa 53
2.3.7.2 Ligao interna 53
2.3.7.3 Sem ligao 53
2.3.8 Valor 53
2.4 Literal e outros conceitos
54
2.4.1 Literal C++ 54
2.4.1.1 Literais inteiros 54
2.4.1.2 Literal booleano 54
2.4.1.3 Literal de ponto flutuante 55
2.4.1.4 Literal caractere 55
2.4.1.5 Literal vetor de caracteres 56
2.4.2 Declara ou define 56
2.4.2.1 Declara 57
2.4.2.2 Regra de Definio singular 58
2.4.3 lvalue 58
2.4.4 Rtulo 59
2.5 Namespace
59
2.5.1 Diretiva using traz namespace para o alcance 60
2.6 Operadores C++
61
2.6.1 Operador de precedncia ( ) 63
2.6.2 Operador de Alcance :: 63
2.6.3 Miscelnea 63
2.6.4 Operadores Unrios 64
2.6.4.1 Incremento e decremento unitrio 64
2.6.4.2 Complemento de um 64
2.6.4.3 No ! 65
2.6.4.4 Mais unrio 65
2.6.4.5 Menos unrio 65
2.6.4.6 Ponteiros, referncias e seleo de membro 65
2.6.5 Operadores aritmticos binrios 66
2.6.6 Operadores binrios comparativos 67
2.6.7 Operadores lgicos binrios 67
2.6.8 Atribuio 68
2.6.9 Operador throw (Excees) 69
2.6.10 Operador , (Sequncia) 69
2.7 Avaliao de expresses e instruo em C++
69
4 | C++ Explicado e aplicado

C++_CG.indd 4

20/04/2016 11:57:14

2.7.1 Instruo expresso 70


2.7.2 Instruo composta ou bloco 70
2.7.3 Instruo declarao/definio 70
2.7.4 Promoes e Converses aritmticas 71
2.7.4.1 Converses aritmticas 71
2.7.4.2 Promoes inteiras 72
2.7.4.3 Promoo de ponto flutuante 72
2.7.5 Ambiguidades 72
2.8 Funo
73
2.8.1 Declara, Define, Chama funo 75
2.8.1.1 Declara funo 75
2.8.1.2 Define funo 77
2.8.1.3 Chama uma funo 77
2.8.1.4 Varivel static em funo 78
2.8.2 Funo main 78
2.8.3 Valor inicial para objetos no locais 79
2.8.4 Encerramento do programa 79
2.9 Instrues de controle
79
2.9.1 Instrues de salto 80
2.9.1.1 Instruo goto 80
2.9.1.2 Instruo break 80
2.9.1.3 Instruo continue 80
2.9.2 Seleo simples - if 80
2.9.3 Instruo for 82
2.9.4 Instruo while 82
2.9.5 Efeitos colaterais em instrues de controle 83
2.9.6 Exemplo incluindo vector STL 84
2.9.7 Exerccios intermedirios ao captulo 2 85
2.10 Classes em C++
91
2.10.1 Declara/define classe C++ 91
2.10.1.1 Tipo Classe 91
2.10.1.2 Ident ou nome da classe 91
2.10.1.3 Herana 92
2.10.1.4 Membros de classes 92
2.10.1.5 Define classe 93
2.10.1.6 Encapsulamento em classe (class ou struct) 94
2.10.2 Struct em C++ 96
2.10.3 Union 96
2.10.4 Seleo de membro de classe 98
2.10.5 Construtor 99
2.10.5.1 Erro na construo e tipo de retorno 101
2.10.5.2 Converso de objetos de classe para outra 101
2.10.5.3 Valores iniciais para os membros 103
C++ Explicado e aplicado | 5

C++_CG.indd 5

20/04/2016 11:57:14

2.10.5.4 Chamada de construtor para iniciar objeto 104


2.10.6 Durao em memria para objetos 105
2.10.7 Herana simples 105
2.10.7.1 Restritores de acesso na herana 108
2.10.8 Construtor de classe derivada 110
2.10.9 Construo na memria heap 112
2.10.10 Construo em dilogos 112
2.10.11 Fases de um objeto em construo 112
2.10.12 Destruidor 112
2.10.13 Polimorfismo 114
2.11 Exemplo de Hierarquia de classes (taxonomia)
115
2.12 Coero ou converso explcita (type casting)
118
2.13 RTTI (Run Time Type Identification)
119
2.14 Entrada e Sada
119
2.14.1 Uso de IOSTREAM 119
2.14.2 Princpios de construo de iostream 119
2.15 Alocao dinmica de memria
122
2.15.1 Aloca memria para varivel e objeto 122
2.16 Preprocessador
124
2.16.1 Inclui arquivo 124
2.17 Excees
125
2.18 Template
126
2.18.1 Template de funo 127
2.19 Interfaces
129
2.19.1 Interface Escolha uma opo (pick-up a number)
130
2.20 Testes e Integrao
131
2.21 Exemplo e Exerccios
133

CAPTULO 3

137

C++ Nvel 2

137
3.1 Associaes entre classes
137
3.2 Tipos
138
3.2.1 Tipo void 138
3.2.2 Tipo enum (enumerao) - formato C++03 138
3.2.3 Typedef 139
3.2.4 classe string 140
3.2.4.1 Constri 141
3.2.4.2 Atribui: operador e funes 142
3.2.4.3 Navega via iteradores 143
3.2.4.4 Informa Tamanho e Capacidade 143
3.2.4.5 Acessa Elementos 144
3.2.4.6 Concatena 144

6 | C++ Explicado e aplicado

C++_CG.indd 6

20/04/2016 11:57:14

3.2.4.7 Insere 145


3.2.4.8 Apaga 146
3.2.4.9 Substitui 146
3.2.4.10 Compara 147
3.2.4.11 Obtm parte de string 148
3.2.4.12 Converte 148
3.2.4.13 Busca 149
3.2.4.14 Funes e operadores globais relacionados 151
3.2.4.15 Exemplo envolvendo string 153

3.3 Visibilidade e alcance em classes

155
3.3.1 Alcance classe 157
3.3.1.1 Declarao using em classes 157
3.3.5 Alcances global e namespace 159
3.3.5.1 Alcance global 159
3.3.5.2 Alcance namespace 159
3.3.5.3 Diretiva using em namespace 160
3.6 Operadores bit a bit
161
3.6.1 Operadores binrios de deslocamento bit a bit 161
3.6.2 Operadores binrios bit a bit (E, Ou, OuExc) 162
3.6.3 Atribuio composta 163
3.7 Promoes e Converses
164
3.7.1 Converses inteiras via cast (estilo C ou C++) 164
3.7.2 Converses de ponto flutuante via cast (C ou C++) 164
3.7.3 Converses entre ponto flutuante e inteiro 164
3.8 Funes
165
3.8.1 Acmulo em funes e operadores 165
3.8.1.1 Acmulo em funo 166
3.8.1.2 Acumula em operadores (operator overloading) 167
3.8.1.3 Acmulo no operador de atribuio 169
3.8.1.4 Acmulo no operador de chamada de funo 170
3.8.1.5 Acmulo no operador Subscrito 171
3.8.1.6 Acmulo em incremento e decremento unrios 172
3.8.1.7 Resoluo de acmulo 173
3.8.2 Funo com nmero varivel de parmetros 175
3.8.3 Encerramento de programa 176
3.8.3.1 Trmino via abort 176
3.8.3.2 Trmino via exit 176
3.8.3.3 Funes atexit 177
3.9 Instrues de controle
178
3.9.1 Seleo composta: switch 178
3.9.2 Instruo do while 180
3.9.3 Operador condicional (if ternrio) 180
3.10 Classes: polimorfismo, herana mltipla
181
C++ Explicado e aplicado | 7

C++_CG.indd 7

20/04/2016 11:57:14

3.10.1 Polimorfismo 181


3.10.2 Funes virtuais puras e classe abstrata 185
3.10.2.1 Classe abstrata e coleo heterognea 185
3.10.2.2 Acesso a objeto derivado e coero de tipos 189
3.10.2.3 Ponteiros em Hierarquias de classe 189
3.10.2.4 Polimorfismo sem classe abstrata 190
3.10.2.5 Membros estticos em classes 191
3.10.3 Herana mltipla 192
3.10.3.1 Sintaxe da herana mltipla 193
3.10.3.2 Herana mltipla independente 193
3.10.3.3 Herana do tipo diamante (dreaded diamond) 195
3.10.3.4 Alcance dos membros sob herana mltipla 196
3.10.3.5 Construtor ambguo em herana mltipla 197
3.10.3.6 Delegao via Diamante 198
3.10.3.7 Const e Referncia em herana mltipla 199
3.10.4 Seleo em ponteiros para membros
200
3.10.5 Construtor de cpia e operador de atribuio 201
3.10.5.1 Construtor de cpia 201
3.10.5.2 Operador de atribuio 202
3.10.6 Declarao de acesso 203
3.11 Exemplo de uso de associao entre classes
205
3.12 Cast ao estilo C++
209
3.12.1 static_cast 210
3.12.2 Dynamic_cast 212
3.12.3 Const_cast 214
3.12.4 Reinterpret_cast 214
3.13 RTTI identifica objetos em runtime
215
3.14 Entrada e Sada
217
3.14.1 Disco 217
3.14.1.1 Disco como meio de armazenar dados 218
3.14.1.2 stream em disco 219
3.14.2 Biblioteca iostream 220
3.14.2.1 classe IOS 221
3.14.2.2 classe istream 225
3.14.2.3 Classe ostream 230
3.14.2.4 classe iostream 231
3.14.2.5 classe fstream 231
3.14.2.6 classe stringstream 236
3.14.3 Persistncia automtica 237
3.15 Alocao dinmica de memria
237
3.15.1 Aloca memria para vetor 237
3.15.2 Libera memria de vetor 239
3.15.3 Evite erros de gerncia de memria livre
240
8 | C++ Explicado e aplicado

C++_CG.indd 8

20/04/2016 11:57:14

3.16 Pr-processador

241
3.16.1 Comandos define e undef do pr-processador 241
3.16.2 Compilao condicional 242
3.16.3 Constantes pr-definidas 244
3.17 Excees C++
245
3.17.1 Lista de excees arremessveis 245
3.17.2 Classe exception 247
3.18 Template
248
3.18.1 Casamento de chamadas sob templates 248
3.18.2 Templates de classes 249
3.18.2.1 Cria cdigo inicial, sem templates 250
3.18.3 STL: Standard Template Library 253
3.18.3.1 Continer vector 253
3.18.3.2 Funes e operadores sobre vector (e list) 255
3.18.3.3 Exemplo de uso de STL (list e vector) 258
3.18.3.4 Funes especficas de list 261
3.19 Interfaces de usurio Parte 2
265
3.19.1 Interface GUI para uma loja de aeroporto 266
3.19.2 Introduo ao Qt 267
3.19.3 Interface baseada em Browser 268
3.20 Testes e Integrao
268
3.20.1 Custo do erro versus fase de deteo 269
3.20.2 Tamanho dos mdulos e complexidade 270
3.20.3 Coeso e acoplamento 270

CAPTULO 4

273

C++ Nvel 3 Proficiente!

273
4.1 O novo Standard C++11
273
4.1.1 Itens no definidos do C++ 274
4.1.2 Palavras reservadas C++11 275
4.2 Tipos
276
4.2.1 long long e long double <C++11> 276
4.2.2 Tipo Campo de bits 277
4.2.3 Padres de armazenamento Little Endian e Big Endian 277
4.2.4 Alinhamento em memria <C++11> 279
4.2.5 Especificador nullptr <C++11> 279
4.2.6 Deduo automtica de tipo e decltype <C++11> 280
4.2.7 C++11 evita narrowing (estreitamento) em { }iniciador <C++11> 281
4.2.8 Atributos C++11 [[atr]] <C++11> 282
4.2.9 Enumerao fortemente tipada <C++11> 282
4.2.10 Unio generalizada <C++11> 284
4.2.11 Complex (template de classe) <C++11> 286
C++ Explicado e aplicado | 9

C++_CG.indd 9

20/04/2016 11:57:14

4.3 Qualificaes

288
4.3.1 Durao Mutable 288
4.3.2 Qualificador volatile 288
4.3.3 Constexpr expresses constantes <C++11> 289
4.3.4 Especificao elaborada de tipo 290
4.3.5 Referncia a rvalue <C++11> 291
4.4 Literais C++11
293
4.4.1 Literal definido pelo usurio <C++11> 293
4.4.2 Literal Raw string (string no tratada) <C++11> 295
4.5 namespace - define, ou estende
295
4.5.1 namespace nomeado 296
4.5.2 namespace annimo 296
4.5.3 Aninhamento de namespace 297
4.5.4 Define membros de namespace 297
4.5.5 Membro de namespace 298
4.5.6 Sinnimo de namespace 298
4.5.7 Declarao using traz elemento para o alcance 299
4.5.8 Diretiva using traz namespace para o alcance 300
4.5.9 Inline namespace 302
4.6 Ponteiro simples e ponteiro inteligente (smart pointer) 303
4.6.1 Aritmtica de ponteiros simples 303
4.6.2 Ponteiros em colees STL 304
4.6.3 Define e discute aspectos dos ponteiros inteligentes <C++11> 306
4.6.3.1 Define ponteiro inteligente 306
4.6.3.2 Acesso ao ponteiro simples (atributo) 307
4.6.3.3 Gerenciamento da memria heap (garbage collection) 308
4.6.3.4 Poltica de cpia 308
4.6.3.5 A segurana do software que o usa 309
4.6.3.6 Suporte a multiprogramao 309
4.6.4 Ponteiros inteligentes suportados por C++11 309
4.6.4.1 Tipo incompleto: definio 309
4.6.5 Classe shared_ptr 310
4.6.5.1 Shared_ptr resolve o problema de auto_ptr 311
4.6.5.2 Detalha shared_ptr 311
4.6.5.3 Exemplo de uso de shared_ptr 319
4.6.6 Classe weak_ptr 320
4.6.6.1 Define a classe weak_ptr 321
4.6.6.2 Exemplo1 de uso de weak_ptr 322
4.6.6.3 Exemplo2 de weak_ptr evita dependncia circular 322
4.6.7 Classe unique_ptr 324
4.6.7.1 Razes para se ter unique_ptr 325
4.6.7.2 Define a classe unique_ptr 326
4.6.7.3 unique_ptr opera arrays 328
10 | C++ Explicado e aplicado

C++_CG.indd 10

20/04/2016 11:57:14

4.6.7.4 Exemplos de uso de unique_ptr 329


4.6.7.5 Compatibilidade com contineres e algoritmos 330

4.6.8 Exemplo envolvendo ponteiros inteligentes 331


337
4.7.1 Introduz as expresses regulares como C++11 trata 338
4.7.2 Detalha as expresses regulares em C++11 340
4.7.2.1 Caracteres simples e formato em arquivos 340
4.7.2.2 Expresses colchete e classes de caractere 341
4.7.2.3 Escape dsw 342
4.7.2.4 Repetio e modo no guloso 342
4.7.2.5 Concatenao 343
4.7.2.6 Agrupamento e grupo de captura 343
4.7.2.7 ncoras 343
4.7.2.8 Olhar frente (Look-ahead) 344
4.7.2.9 Grupo de captura em substring 345
4.7.2.10 Referncia para trs 345
4.7.2.11 Precedncia 345
4.7.2.12 Cdigos de caractere 346
4.7.2.13 Elemento de ordenao alfabtica (Collating Element) 346
4.7.2.14 Classe de equivalncia 346
4.7.2.15 Exemplos de regex 346
4.7.3 Apoio ao processamento de regex literal raw string 347
4.7.4 O processamento das expresses regulares em C++11 349
4.7.4.1 Tipos 349
4.7.5 Algoritmos para regex 353
4.7.5.1 Algoritmo regex_match 353
4.7.5.2 Algoritmo regex_search 356
4.7.5.3 Regex_replace 359
4.7.6 Busca repetida 362
4.7.6.1 Classe regex_iterator 362
4.7.6.2 Classe regex_token_iterator 366
4.7.7 Funo que l CSV via regex 369
4.8 Funo
370
4.8.1 Qualificao CV 370
4.8.2 Funes de outras linguagens 371
4.8.3 Expresso Lambda substitui objeto funo <C++11> 371
4.9 Instrues de controle
374
4.9.1 Comando range-for <C++11> 374
4.9.2 Recurso 374
4.10 Melhorias na definio de classes em C++11
376
4.10.1 Delegao de construtores <C++11> 376
4.10.2 Funes Defaulted e Deleted <C++11> 378
4.10.3 Sintaxe uniforme ao iniciar - { } iniciador <C++11> 380

4.7 Expresses regulares em C++11

C++ Explicado e aplicado | 11

C++_CG.indd 11

20/04/2016 11:57:14

4.10.4 POD generalizado <C++11> 382


4.10.5 Controle de deslocamento de virtual <C++11> 383
4.10.6 Operador de converso (via funo) 384
4.11 Exemplo completo
386
4.12 Mais sobre Reinterpret_cast
386
4.13 Polimorfismo - RTTI e identificao de tipo de objeto
386
4.14 E/S nvel 3 padro Fbrica de Objetos (object factory) 389
4.14.1 Fbrica simples 391
4.14.2 Fbrica de objetos polimorfa 391
4.14.3 TypeInfo como identificador 400
4.14.4 Avaliao de desempenho da Fbrica de Objetos 403
4.15 Memria dinmica - placement new
403
4.16 Macros tipo funo e constexpr
407
4.16.1 Macros tipo funo 407
4.16.2 Constexpr expresses constante generalizadas <C++11> 408
4.17 Excees <C++11>
409
4.17.1 Operador noexcept previne propagao de excees 409
4.17.2 Cpia e rearremesso de exceo (multitrilhas) <C++11> 410
4.18 Templates C++11 e aprofundamento <C++11>
410
4.18.1 Extern em templates 411
4.18.2 Tipo local como argumento em template <C++11> 411
4.18.3 Sintaxe para tipo de retorno como sufixo <C++11> 412
4.18.4 Alias de template using <C++11> 413
4.18.5 Variadic Template nmero varivel de parmetros <C++11> 414
4.18.6 Alocadores especializados 416
4.18.7 Tupla <C++11> 418
4.18.7.1 Header Tuple - parcial 418
4.18.7.2 make_tuple (template de funo utilitria) <C++11> 420

4.18.7.3 forward_as_tuple (utilitria) <C++11>

421

4.18.7.4 Tie (utilitria) 421


4.18.7.5 Tuple_cat (utilitria) <C++11> 422
4.18.7.6 ignore (utilitria) 423
4.18.7.7 Tuple - outras funes 424

4.18.8 Especializao, valor implcito, template template 424


4.18.8.1 Polticas via template - opes para criar 425
4.18.8.2 Polticas via template - opes de destruir 427
4.18.9 Fbrica abstrata 430
4.18.10 Contineres associativos set e map 432
4.18.10.1 Discute o continer set 432
4.18.10.2 Discute o continer map 435
4.19 Qt: princpios e exemplo
439
4.20 Baterias de teste qualidade
442
4.20.1 Static_assert e assert 442
12 | C++ Explicado e aplicado

C++_CG.indd 12

20/04/2016 11:57:14

Captulo 4 Anexo - C++14


Anexo 4.1 Recursos adicionados por C++14

443
444
An4.1.1 - Tweak to certain C++ contextual conversions 444
An4.1.2 Literal binrio 444
An4.1.3 Deduo automtica do tipo de retorno em funes 445
An4.1.4 Captura estendida em funes lambda (init-capture) 445
An4.1.5 Lambdas ao estilo template 445
An4.1.6 Variveis do tipo template 446
An4.1.7 funes constexpr menos restritas 446
An4.1.8 Agregaes - iniciadores 446
An4.1.9 Alocao de memria mais eficientes 446
An4.1.10 Liberao de memria com tamanho dado 446
An4.1.11 Attribute [[deprecated]] 447
An4.1.12 Apstrofo como separador em valores numricos 447
An4.2 Alteraes em Bibliotecas
447
An4.2.1 Shared mutex e shared lock 447
An4.2.2 Busca heterognea em contineres associativos 447
An4.2.3 Literais definidos pelo usurio 448
An4.2.4 Acesso a membro de tupla pelo tipo 448
An4.2.5 Funo membro make_unique 448
An4.2.6 Objeto funo para constante inteira 448

CAPTULO 5

449

concorrncia em C++11

449
449
451
5.2.1 Ncleo nico (SISD, SIMD, MIMD) -> multincleo 451
5.2.2 CPUs independentes acopladas 455
5.2.2.1 SMP (Symmetric Multi-Processor) 455
5.2.2.2 Blade (lmina - placa com vrias CPUs) 455
5.2.2.3 Cluster compartilhando memria 455
5.2.2.4. Processamento em Grid e cloud computing 455
5.3 O trinmio hardware x software x profissional
456
5.3.1 Cache: nvel um, dois, trs 457
5.3.2 Pipeline de execuo 460
5.3.2.1 Dependncias de dados 462
5.3.2.2 Dependncia de controle 463
5.3.2.3 Conflito de recursos 464
5.3.2.4 Custo da falha na busca de instruo ou dado no cache 464
5.3.3 Memria intercalada (bancos independentes) 465
5.3.4 Memria compartilhada - OpenMP 465
5.3.5 Lei de Amdahl 465

5.1 Contexto de programao em 2014


5.2 Arquiteturas com grande paralelismo embutido (MPUs)

C++ Explicado e aplicado | 13

C++_CG.indd 13

20/04/2016 11:57:14

5.4 Programas concorrentes - como escrev-los?

467
5.4.1 Formas de concorrncia e paralelismo 467
5.4.2 Concorrncia em transaes 469
5.4.2.1 Ordem das operaes e as transaes 470
5.4.2.2 Operao atmica e sequencial 472
5.4.2.3 Two-Phase-Lock e Two-Phase-Lock restrito 473
5.4.2.4 TM Memria Transacional 474
5.4.3 Problemas do paralelismo em multitrilhas 475
5.4.3.1 Disputa de dados (data race) 475
5.5 Programas concorrentes: POSIX e C++11
479
5.5.1 POSIX e os Sistemas Operacionais 480
5.5.2 Processos POSIX 481
5.5.3 Trilha (pthread POSIX) 483
5.5.3.1 Recursos de uma trilha (pthread POSIX) 484
5.5.3.2 Estados de uma trilha POSIX 484
5.5.3.3 Criao de trilha POSIX 485
5.5.3.4 Sincronizao dos trminos 487
5.5.3.5 Controle de execuo 487
5.5.3.6 Encerramento de trilha POSIX 488
5.5.3.7 Comunicao entre trilhas POSIX 491
5.5.4 Trilha da norma C++11 492
5.5.4.1 Header trilha (simplificado) 493
5.5.5 Objetos sincronizadores POSIX 498
5.5.5.1 Semforo e mutex 499
5.5.5.2 Bloqueio Read-Write POSIX 503
5.5.5.3 Varivel de condio (POSIX e C++11) 505
5.5.5.4 Bibliotecas thread seguras (reentrantes)
509
5.6 Itens especficos C++11
509
5.6.1 Modelo de memria C++11 509
5.6.2 Deteo de disputa de dados 512
5.6.3 Tempo: namespace chrono 515
5.6.4 Sincronizao de acesso 517
5.6.4.1 Locks 519
5.6.4.2 Call once - inicia, sem disputas de dados 523
5.6.4.3 Future, async, packaged_task, promise 525
5.6.4.4 Async 527
5.6.4.5 Packaged_task 531
5.6.4.6 promise < > e excees 533
5.6.4.7. Excees via promise 536
5.6.4.8 Shared_future 537
5.6.4.9 Header future, async, packaged_task, promise 537
5.6.5 Atomic 542
5.6.5.1 Atomic - tipo atomic_flag 544
14 | C++ Explicado e aplicado

C++_CG.indd 14

20/04/2016 11:57:14

5.6.5.2 Atomic - Grupo G2 545


5.6.5.3 Atomic - Grupo G3 547
5.6.5.4 Atomic - Grupo G4 547
5.6.5.5 Atomic - Grupo G5 548
5.6.5.6 Propriedade e estruturas lock_free 549
5.6.5.7 Sincronizao e fence 551

5.7 Modelos concorrentes

554
5.7.1 Padres de arquitetura para programas concorrentes 555
5.7.2 Modelos de Projeto Concorrente 557
5.7.2.1 Padro Chefe trabalhadores (boss workers) 557
5.7.2.2 Padro produtor(es)/consumidor(es) 558
5.7.2.3 Pipeline em software 560
5.7.2.4 Padro peer-to-peer 561
5.7.2.5 Memria transacional
561
5.7.3 Ordenao em CPU Multi-Core SIMD 561
5.8 Acesso concorrente granularidade
563
5.9 Ferramentas de projeto de programas concorrentes
564
5.10 CSP - Communicating Sequencial Processes (e MPI)
564
5.10.1 MPI - Message Passing Interface 565
5.10.2 OpenMP - Open Multi Processing 565
5.10.3 MPI combinado com OpenMP 565
5.11 Testes e depurao de programas concorrentes
566
5.11.1 Erro envolvendo duas ou mais variveis 566
5.12 Modelo de memria da norma C++11
568

CAPTULO 6

573

Internacionalizao Sob C++

573
6.1 Arrumei num produto veio tudo errado no outro
573
6.1.1 A ortografia, problema nosso 573
6.1.2 Softwares com cdigos distintos na mesma plataforma 574
6.1.3 Incompatibilidade em sistemas operacionais distintos 575
6.1.4 Desalinhamento para acentuados e 575
6.1.5 A WEB amplia o problema 575
6.1.6 Retirar os acentos inaceitvel 576
6.2 Internacionalizao (Internationalization = i18n) sob C 576
6.2.1 O locale C 577
6.2.2 O locale C++ 578
6.2.3 As diferenas entre locale C e locale C++ 579
6.3 Estudo do locale C++
579
6.3.1 Classe e objeto locale 579
6.3.1.1 Facetas executam os servios 579
6.3.2 A classe locale 581
Conceitua objetos e apresenta c++ | 15

C++_CG.indd 15

20/04/2016 11:57:14

6.3.3 Soluo para data internacional 583


6.3.4 Criao de uma faceta 586
6.3.5 Substitui-se a faceta padro 587
6.3.6 Uma implementao da faceta Calcado 589
6.4 Um pouco mais de luz sobre locale e facet
595
6.4.1 O construtor de faceta 596
6.4.2 O template de funo use_facet < > ( ) 597
6.4.3 O template de funo has_facet < > ( ) 597
6.5 Internacionalizao nos seus vrios desafios
598
6.5.1 Exportao e importao de software 598
6.5.2 Cdigos de caractere e pontos de cdigo 599
6.5.2.1 ASCII 599
6.5.2.2 Latin-1 599
6.5.2.3 Unicode 600
6.5.2.4 UTF-8, UTF-16 e UTF-32 601
6.5.3 A soluo para acentuados e bem como umlauts 601
6.5.4 L10n para a interface de usurio de programas 602
6.5.5 L10n em ambiente de programa concorrente 604
6.5.6 Teste de compatibilidade 604
6.5.7 Loja de calados internacional 604

CAPTULO 7

607

Como Criar e Manter Sistemas Sob C++

607
607
7.1.1 Princpio nmero 1: o mais barato primeiro aprender 608
7.1.2 O que a engenharia de software abrange 608
7.1.3 Objetos: fases iniciais do ciclo de vida 609
7.2 Ciclos de desenvolvimento e manuteno de sistemas
609
7.2.1 Ciclo de vida de software (processo) 610
7.2.2 Produto, processo e mtodos 610
7.2.3 Processo e mtodo devem controlar complexidade e a volatilidade 610
7.2.4 As pessoas e seus papis 611
7.2.5 Paradoxo marketing x tecnologia 611
7.2.6 Modelos de processo em software 612
7.3 Detalha o ciclo de ganho global
613
7.3.1 Setores 1 a 3 do ciclo de ganho global 614
7.3.2 Setor 4: avalie os riscos 616
7.3.3 Setores 5 e 6 do ciclo de ganho global 616
7.3.4 Marcos intermedirios 617
7.3.5 Planos via 5QRC (5WHs) 618
7.4 Ciclo Correto por construo
619
7.4.1 Princpios do Ciclo Correto por Construo (CbyC) 619

7.1 Engenharia de software

16 | C++ Explicado e aplicado

C++_CG.indd 16

20/04/2016 11:57:15

7.4.2 Estratgias para atender a Pr1 e Pr2 619


7.4.3 Compara CbyC com CMM 620
7.4.4 Do conta no CbyC 620
7.4.5 Especificao formal via linguagem Z 621
7.4.6 Barreiras na adoo de CbyC 622
7.4.7 Exemplo de uso do CbyC em um produto 622
7.5 Combinam-se o Ciclo de Ganho Global e o CbyC sob C++ 624
7.6 Unificao: uma utopia?
625
7.7 Gerenciador de verses
625
7.8 Ambiente apropriado ao reso
626
7.9 Curva de aprendizado e curva S
627

CAPTULO 8

629

BDOO e Interface Baseada em Browser

629
8.1 Alguns conceitos sobre bancos de dados
629
8.1.1 Banco de dados relacional alguns conceitos 630
8.1.2 Modelo Rede ou hierrquico apresentao 631
8.1.3 Orientado a objetos 632
8.1.4 Modelo cliente servidor ou embarcado 632
8.2 Aprofunda o tema BDOO
632
8.2.1 Linhas definidas pelo Manifesto 632
8.2.1.1 Objetos complexos (compostos em C++) 634
8.2.1.2 Identidade do objeto 634
8.2.1.3 Encapsulamento 635
8.2.1.4 Tipos e classes 636
8.2.1.5 Hierarquias, via herana 636
8.2.1.6 Polimorfismo e amarrao tardia 636
8.2.1.7 Completeza computacional 636
8.2.1.8 Extensibilidade 637
8.2.1.9 Persistncia 637
8.2.2 Itens opcionais do manifesto 637
8.2.2.1 Herana mltipla 637
8.2.2.2 Checagem de tipos 638
8.2.2.3 Inferncia 638
8.2.2.4 Distribuio 638
8.2.2.5 Transaes longas 638
8.2.2.6 Verses 638
8.2.3 Recursos livres 638
8.2.3.1 Paradigma de programao 639
8.2.3.2 Sistema de representao 639
8.2.3.3 Sistema de tipos 639
8.2.3.4 Uniformidade 639
Conceitua objetos e apresenta c++ | 17

C++_CG.indd 17

20/04/2016 11:57:15

8.3 Orientao a objetos e BD relacional no casam bem


8.4 Bancos de Dados orientados a objetos
8.5 Uma soluo integrada via bibliotecas

639
640
640
8.5.1 Apresenta a Berkeley DB 640
8.5.2 Banco de Dados OO via Berkeley DB 641
8.5.3 Apresenta a interface via STL para a Berkeley DB 641
8.5.4 Uma implementao de BDOO puramente C++ 646
8.6 Interface baseada em browser
646
8.7 Programa exemplo dos Captulos 5 a 8
646

Anexo Respostas aos exerccios

Exerccios intermedirios ao captulo 2 - Item 2.9.7


Exerccios do final do captulo 2 respostas

647
647
651

18 | C++ Explicado e aplicado

C++_CG.indd 18

20/04/2016 11:57:15

CAPTULO 1
Conceitua Objetos e Apresenta C++

recisamos de conceitos para raciocinar e de ferramentas para expressar o raciocnio, ensinou Niklaus Wirth, um dos grandes cientistas da computao, autor
das linguagens Pascal e Modula. Por isso, este captulo monta uma base de
apoio a objetos e tambm a programao concorrente. Se algum desses itens lhe for
familiar, pule-o, por gentileza. Por outro lado, novos conceitos esto distribudos ao
longo dos demais captulos do livro para no sobrecarregar demais o leitor.

1.1 Completeza e complexidade computacional


Uma linguagem de programao completa no sentido computacional quando permite
escrever qualquer algoritmo. A teoria, no caso, se baseia nas mquinas de Turing. Em
termos bem simples, uma linguagem completa permite;
Escrever sequncias de aes;
Selecionar entre duas aes alternativas;
Repetir uma ou mais aes sob o controle de alguma condio de repetio.
Um exemplo simples buscar um nmero em uma lista de nmeros. Por exemplo, dada
a lista: 1, 2, 3, 5, 7, 11, 13, 17, ... que conteria os nmeros primos at 1.000, ver se nela
h, ou no, o nmero 389 (Procurado = 389).
Algoritmo: busca sequencial (boa para coleo sequencial pequena)
Pe Falso em Achou
Inicia PosicAtual como primeiro
Repete enquanto PosicAtual pertencer lista de nmeros
Se Valor em PosicAtual for igual a Procurado
ento pe Verdadeiro em Achou e encerra o lao de repetio
seno Avana PosicAtual
FimSe
FimRepete
Achou indica se est (Verdadeiro) ou no (Falso)

O algoritmo simples, embora use algumas convenes de programao (Achou dito


um flag; a denteao em Repete e Se; Repete e Se delimitam seus blocos). Mas contm os trs
elementos bsicos, ou seja: sequncia (uma instruo aps outra), seleo (representada pelo
Se ento seno) e repetio (Repete e Fim Repete), as duas ltimas representando grandes
oportunidades de erro de programao. Sua forma dita pseudocdigo (linguagem inacessvel ao computador). Mas, ao invs de repetir sequncias, pode-se fazer recurso, em que uma
funo chama a si mesma. O problema anterior tambm adequado para busca recursiva
(seja Procurado = 13). No caso, a funo Membro, a seguir, d conta da tarefa:
Conceitua objetos e apresenta c++ | 19

C++_CG.indd 19

20/04/2016 11:57:15

Membro ->
Lista contm Procurado se ele for igual ao primeiro elemento da Lista. Encerra a busca, com
resultado Verdadeiro
Separa a Cauda da Lista, retirando o primeiro.
Se Cauda vazia, encerra com Falso.
Procurado est na lista se for Membro da Cauda da Lista
(chama a si mesma, com Lista diferente)

Uma simulao com a lista dada, Procurado = 13, est abaixo.


1 3 5 7 11 13 17 ...
3 5 7 11 13 17 ...
5 7 11 13 17 ...
7 11 13 17 ...
11 13 17 ...
13 17 ...

(13 no membro pois difere de 1)


(13 no membro pois difere de 3)
(13 no membro pois difere de 5)
(13 no membro pois difere de 7)
(13 no membro pois difere de 11)
(13 membro por ser o primeiro) - nesse ponto deve parar

Outro ponto bsico em algoritmo recursivo a condio de parada (por exemplo, se


Procurado no estiver na lista, chega-se cauda vazia que encerra a recurso com falso).
C++ opera melhor iteraes (repeties) do que recurses.
Um algoritmo um processo definido, que resolve um dado problema em tempo
finito. Um conceito adicional importante a complexidade, em geral ligada a ciclos
repetitivos e que diz, dados dois algoritmos, qual seria o mais eficiente, sem executar
o cdigo. Na busca sequencial, o algoritmo, descrito anteriormente linear, ou seja, o
tempo gasto proporcional ao nmero de elementos.

1.2 Bases de Numerao e Base 2


Em alguns pontos, fundamental saber como o C++ armazena internamente os nmeros e tambm pensar em termos de bits. A resoluo de acmulo em funes (item
3.8.1), se baseia nos tipos dos argumentos. O modelo de memria, do Captulo 5, que
suporta programao concorrente ao definir posio de memria pode chegar aos bits.
Os trs tipos de campo mais usados em C++ so:
Numrico inteiro, que aceita, por exemplo 2014 (ano atual);
Numrico de ponto flutuante (notao inglesa), como o nmero 3.141528--- o
da matemtica ( Circunferncia = 2 x x Raio);
Caractere: combinao de bits com significado em alguma tabela de caracteres (8
bits = byte, o mais comum) - importante para a parte de textos, mas que tambm
pertence aos inteiros (C++ permite operaes aritmticas sobre caractere).
Esses tipos podem aparecer como atributos de objetos (um objeto tem atributos e operaes),
em que os atributos definem o estado do objeto e as operaes o seu comportamento.
O que segue a ponta do iceberg, mas permite discriminar bem os dois tipos numricos, essencial em certos pontos, alm dos formatos que operam bits.

20 | C++ Explicado e aplicado

C++_CG.indd 20

20/04/2016 11:57:15

1.2.1 Bases de numerao, formatos inteiro e de ponto flutuante


Nosso sistema decimal posicional, ou ponderado. Por exemplo:
845 = 8 x 102 + 4 x 101 + 5 x 100 (exemplo de nmero inteiro)
35,43 = 3 x 101 + 5 x 100 + 4 x 10-1+ 3 x 10-2 (exemplo de nmero fracionrio)

Divises sucessivas por 10 separam os algarismos da base 10, de um inteiro:


845 / 10 = 84
84 / 10 = 8
8 / 10 =
0

com resto
com resto
com resto

5 (menos significativo)
4

8 (mais significativo)

A mesma sequncia transforma da base 10 para qualquer base inteira (so polinmios
em x, com valores distintos de x, mas de mesmo valor y).
845 / 2 =
422 / 2 =
211 / 2 =
105 / 2 =
52 / 2 =
26 / 2 =
13 / 2 =
6/2 =
3 /2 =
1 /2 =

422 com resto


211 com resto
105 com resto
52 com resto
26 com resto
13 com resto
6 com resto
3 com resto
1 com resto
0 com resto

1 (menos significativo)
0
1
1
0
0
1
0
1
1 (mais significativo)

Portanto: 84510 = 11010011012 (restos lidos de baixo para cima).


Internamente, o computador s tem o bit mas para ns muito chato e sujeito a erros ficar escrevendo longas sequncias de bits, como 32 bits por exemplo, tpicos de um
PentiumR. Por isso, as bases 8 e 16 tm grande importncia, pois sendo potncias de 2, a
converso da base 2 para qualquer uma delas imediata. Juntando trs a trs bits, a partir
da direita tem-se base 8 (algarismos 0 a 7) e juntando-se quatro a quatro bits a partir da
direita tem-se base 16 (algarismos 0 ... 9 a b c d e f ou A B C D E F) tanto faz a caixa.
Um teste simples, na base 16 (hexadecimal):
845 / 16 = 52 com resto
52 / 16 = 3 com resto
3 / 16 = 0 com resto

13 (10 = A; 11 = B; 12 = C; 13 = D; 14 = E; 15 = F)
4
3

Com o que 84510 = 34D16 o qual, expandido em 4 bits para cada algarismo, resulta
0011 0100 1101 na base 2, ou seja, o nmero obtido anteriormente.
interessante observar tambm que os pesos na base 2, de 210 a 20 so:
(1024 512 256 128 64 32 16 8 4 2 1) 1024 bytes = 1K bytes

O C++ aceita literais nas bases 8 e 16 (por exemplo 0x34D, o nmero anterior, na base
16) , mas no na base 2. Quanto aos inteiros, ele oferece duas verses padronizadas:
short int: com sinal mais quinze bits (short tipo C++ que leva caixa em conta);
long int: com sinal mais 31 bits (C++11 adicionou long long int).
Conceitua objetos e apresenta c++ | 21

C++_CG.indd 21

20/04/2016 11:57:15

Sendo que ambos podem ser unsigned, em que todos os bits passam a ser usados para
armazenar um valor positivo (portanto, 16 e 32 bits, respectivamente). Isso d os formatos abaixo, para o caso com sinal, para o nmero 845 da base 10.
0 000 0011 0100 1101 short (sinal e 15 bits)
0 000 0000 0000 0000 0000 0011 0100 1101

long (sinal e 31 bits)

Onde se v que, para transformar short em long (dita uma promoo inteira), basta
acrescentar bits (zeros, para positivo, e uns para negativo em complemento de 2). Complemento de 2 a forma interna como o computador armazena os inteiros negativos.
Suponhamos a operao aritmtica:
x = 83 - 54 (4 para 13 = 9, com emprstimo; 5 para 7 = 2)
ou seja: x = 29. Mas o conceito de emprstimo complicado

Essa operao poderia ser feita usando complementos de 9 e de 10:


x + 1 + 99 = 83 + (1 + 99 - 54)
x + 100 = 83 + 1 + 45
x + 100 = 83 + 46
x + 100 = 129 ou seja x = 29

- parntese s para delimitar operao


45 complemento de 9 de 54
46 complemento de 10 de 54
tirando-se 100 de ambos os lados.

Mas na base10, obter o complemento de 9 e de 10 ainda trabalhoso, dado o nmero


de combinaes. J na base 2, o processo trivial: para obter o complemento de 1,
basta inverter os bits (0 vira 1 e 1 vira zero). Somando-se 1 ao complemento de 1, obtm-se o complemento de 2. E, de fato, repetindo-se a operao anterior para a base 2:
x = 83 - 54 passando-se minuendo e subtraendo para a base 2:
x = 1010011 - 0110110 (omitida a converso por divises sucessivas)
x + 1 + 1111111 = 1010011 + (1 + 1111111 - 0110110)
x + 10000000 = 1010011 + 1 + 1001001 (complemento de 1, inverte os bits)
x + 10000000 = 1010011 + 1001010 (complemento de 2 do subtraendo)

A seguir somados, aplicando a tabela da soma da base 2:


1010011
1001010
10011101

+
0
1

0
0
1

1
1
(0 vai 1)

Tabela da
soma na base 2

em que o resultado pode ser reescrito como:


10000000 + 11101

O que permite desprezar os termos 10000000, adicionados no incio e observar que


11101 = 29 na base 10. No caso, o resultado foi positivo e houve transporte para a
posio 27. Se o resultado for negativo no haver o transporte e o resultado estar em
complemento de 2. Nesse caso o computador guarda o nmero com bit de sinal valendo
1 e o restante como complemento de 2.
Por conta do uso do complemento de 2 para nmeros inteiros negativos, o computador s tem somador, ou seja, soma e diferena so feitas no mesmo processador, usando
22 | C++ Explicado e aplicado

C++_CG.indd 22

20/04/2016 11:57:15

o conceito de complemento de 2. Observe-se tambm que inverter o sinal de um nmero na representao inteira uma operao cara, bem diferente do que ocorre com um
nmero em ponto flutuante, que usa a conveno de sinal e amplitude.

Normas IEEE-754 e IEEE-744 para ponto flutuante


Elas padronizam a forma de representar nmeros com parte fracionria. H duas
normas: a primeira, IEEE-754, opera sobre nmeros fracionrios em geral; a segunda, IEEE-744, especfica para nmeros em formato BCD (formato conveniente
para grande volume de entrada e sada, codifica cada algarismo da base 10 em 4
bits, da o nome: BCD = Binary Coded Decimal). A mais usada e presente aqui a
IEEE-754, que representa um padro de fato da indstria de computadores. Todas
as CPUs, a partir do incio dos anos 90, a implementam. Isso eliminou as diferenas
na parte fracionria dos nmeros, frequentes em CPUs de diferentes fabricantes,
onde cada CPU tinha seu prprio formato para ponto flutuante. Em muitos casos,
essa diferena podia aparecer em centavos de dinheiro, com grandes crises nas reas
de auditoria por ser uma oportunidade de fraude com certeza (um centavo em 100
milhes de clculos acumula um milho). O problema principal que a converso de nmeros com parte inteira e fracionria da base 10 para a base 2 apenas
aproximada, no caso geral. Por isso, comparaes de fracionrios exigem cuidados
especiais pois (0,3 + 0,3 + 0,3 pode dar aproximadamente 0,9) e a comparao entre
a soma e o valor dar diferentes como resultado.
Por outro lado, como o computador tem um nmero limitado de bits para representar o nmero, h um truncamento ao se atingir o bit menos significativo (eventualmente
aps um arredondamento). O problema se complica ainda mais quando o nmero final
o resultado de diversas operaes aritmticas, cada uma delas podendo gerar impreciso. Um exemplo notvel so os grficos em um vdeo em que os resultados em ponto
flutuante se ajustam a pixels, que representam posies inteiras na matriz x,y da tela.

Formato geral da norma IEEE-754


Especifica que nmero em ponto fluexpoente
sinal do
tuante fique como X = 1.f x 2exp-Delta .
Significando
polarizado
significando
H dois formatos padro: 32 e 64 bits,
ambos no formato da figura, sendo que
para 32 bits (float em C++) o expoente polarizado tem 8 bits e o significando 23 bits.
Portanto f tem 23 bits, Delta = 127 (Delta uma polarizao que dispensa o sinal
para o expoente). J para os nmeros em 64 bits (double) o expoente polarizado tem 11
bits e o significando 52 bits, ou seja, f = 52 e Delta = 1023.
Seja como exemplo converter 147,32 para float e double. Para a parte inteira repete-se o
processo aplicado no item anterior e chega-se a:
14710 = 100100112

Para obter a parte fracionria, observa-se que ela representa potncias negativas da base,
com o que multiplicaes sucessivas permitem gerar os bits da base 2. Isso toma a forma,
para os nove primeiros bits aps a vrgula:
Conceitua objetos e apresenta c++ | 23

C++_CG.indd 23

20/04/2016 11:57:15

0,32 x 2 = 0 + 0,64 (0, o primeiro bit, o mais significativo, agora)


0,64 x 2 = 1 + 0,28
0,28 x 2 = 0 + 0,56
0,56 x 2 = 1 + 0,12
0,12 x 2 = 0 + 0,24
0,24 x 2 = 0 + 0,48
0,48 x 2 = 0 + 0,96
0,96 x 2 = 1 + 0,92
0,92 x 2 = 1 + 0,84

Com o que, at o ponto em que se fez as contas, tem-se:


147,3210 = 10010011,0101000112

Agora aplica-se a propriedade de ponto flutuante, da notao inglesa, que usa ponto
decimal ao invs de vrgula. De fato:
10010011,010100011 = 1,0010011010100011 x 2

Onde a parte do significando foi normalizada, na forma 1,xxx... Falta acertar o expoente, o que para o caso 32 bits (float em C++), Delta = 127, com o que:
exp - 127 = 7 => exp = 134 = 128 + 6 (128 27) = 100001102

Se estiver em dvida, converta 134 para a base 2. Para o caso de 64 bits (double em
C++), Delta = 1023, portanto:
exp - 1023 = 7 => exp = 1030 = 1024 + 6 (1024 210) = 100000001102

Seguem as representaes do nmero 147,32 em ponto flutuante de 32 e 64 bits, segundo a norma IEE-754 (bit de sinal, expoente polarizado, significando)
0 10000110
0010011010100011?..?
float (Sinal 8 bits 23 bits)
0 10000000110 0010011010100011????????????...?
double (S 11 52)

Para transformar de float para double basta acrescentar zeros no expoente polarizado
e tambm no significando (ponto flutuante no trabalha com complemento de dois,
como nos inteiros, j que a aritmtica bem mais complicada. Mas os processadores de
ponto flutuante do conta dela).
Considerando o nmero de bits do significando e o tamanho do expoente em ambos
os casos, chega-se tabela a seguir para nmeros representveis.
Menor nmero

Maior nmero (E+N -> 10N)

32 bits

1.1754E-38

3.4028E+38

64 bits

2.2250E-308

1.7976E+308

O essencial aqui : observar a semelhana entre os dois formatos inteiros (short e long)
bem como entre os dois formatos de pontos flutuante (float e double). E tambm a
grande diferena entre os formatos inteiro e de ponto flutuante. Isso tem um papel predominante na escolha de funo de melhor casamento, no item acmulo em funes e
24 | C++ Explicado e aplicado

C++_CG.indd 24

20/04/2016 11:57:15

resoluo de acmulo (item 3.8.1). Enquanto transformar short para long ou float para
double so promoes, transformar de inteiro para ponto flutuante, ou vice-versa uma
converso, bem mais cara em termos de processamento, como se pode concluir pela
grande diferena nas representaes. Comparar valores em representaes distintas, por
outro lado, implica converter, primeiro, um para a representao do outro (em geral o
compilador vai reclamar).
Mas transformar de long para short (inteiros) ou de double para float (ponto flutuante) pode acarretar perda de bits da representao e, em geral, o compilador vai avis-lo.
O que no impedir que se faa, pois muitas vezes se quer desprezar bits.
Um aspecto bsico do formato IEEE-754 que compara nmeros comparando as
representaes como se fossem nmeros inteiros de 32 ou de 64 bits, e ajustando para o
sinal. Ou seja, a representao dos nmeros de ponto flutuante positivos est em ordem
dos tamanhos dos nmeros, seja para 32, seja para 64 bits, o que d grande ganho nas
comparaes em relao aos formatos proprietrios anteriores.
Como conceitos para a discusso de C++ isso deve ser suficiente. Se voc quiser se
aprofundar, principalmente em ponto flutuante, recomenda-se o artigo de Goldberg
(1991),What Every Computer Scientist should know about floating-point arithmetic.

1.3 Distncia cognitiva e reso


Na criao de um software, a grande pedra sempre foi, , e ser o domnio do problema.
Ou seja, o conjunto de informaes, leis, costumes, frmulas, regras, procedimentos etc,
que caracterizam um dado servio. Levantar esse conjunto dominar o problema.
O especialista de informtica mapeia este domnio: no conjunto de entidades e operaes internas a elas; no conjunto de relaes, operaes e restries interentidades,
que do uma soluo ao problema, segundo um modelo, em geral incompleto. Da a
importncia da anlise, qualquer que seja o mtodo de desenvolvimento.
Reso - grande bandeira dos defensores de desenvolvimento por objetos - no
especfico de objetos. Contempla, isso sim, aspectos bem mais gerais, relacionados ao
ciclo de desenvolvimento, onde cada fase pode gerar componentes reusveis. Afinal gerar
sistemas em computador implica, primeiro, adquirir o conhecimento do problema e,
segundo, transform-lo em cdigo.
Nenhum mtodo consegue acelerar a aquisio do conhecimento a partir de zero (a
velocidade depende muito das pessoas envolvidas no processo). Decorre da a importncia de se reusar conhecimento do domnio do problema, o que implica, por sua vez,
armazen-lo de forma organizada, pesquisvel.
A transformao em cdigo apresenta vrias alternativas, indo desde as linguagens
de segunda gerao, como Assembler, de terceira gerao como Cobol, C, C++, etc. at
os geradores de aplicao. Nas linguagens de terceira gerao destacam-se as linguagens
orientadas para objetos (aqui C++).
fundamental o papel do perito no domnio (por exemplo um gerente de RH que
conhea toda a CLT ajuda muito na anlise de um software para folha de pagamento ).
Abaixo esto recursos necessrios formao de um ambiente reusvel, desde o nvel
da anlise:
Conceitua objetos e apresenta c++ | 25

C++_CG.indd 25

20/04/2016 11:57:15

Aplicao
=>
Perito no domnio
Especificaes reusveis
(busca e seleo)
.....
Produto

domnio
Perito na tecnologia de informtica
Especificaes reusveis
(busca e seleo)

Este ambiente pressupe:


Disposio para reusar;
Treinamento;
Formao da biblioteca de partes reusveis;
Mtodo de pesquisa dessa biblioteca;
Metodologia de reso (uma norma parte).
Krueger (1992) traz o conceito de distncia cognitiva entre o conhecimento do no
especialista e o mdulo reusvel. Usa esse conceito para montar uma escala de reso.
A distncia cognitiva, por exemplo, muito grande em linguagens de terceira gerao,
embora seja bem menor (10 vezes menor) do que para um mdulo correspondente em
Assembler (de fato a distncia cognitiva entre o clculo de um total e os registradores internos da CPU envolvidos na operao muito maior em Assembler, do que operandos
e operadores em C++ por exemplo). Uma forma de reduzir a distncia cognitiva abstrao. Abstrao e reusabilidade so os dois lados da mesma moeda, segundo Krueger.

Distncia cognitiva gera a escala completa


Usando o conceito de distncia cognitiva, Krueger (92) monta a escala a seguir, de possveis sistemticas de reso.
Garimpo
de cdigo

Linguagem de
alto nvel

Linguagem de
muito alto nvel

Sistemas baseados em
transformao

Geradores
de aplicao

Numa ponta est garimpo de cdigo e na outra geradores de aplicao. Garimpo de


cdigo normalmente implica o uso de linguagem e nesta linha aparecem, com distncia cognitiva cada vez menor: linguagens de alto nvel (3G) ; Esquemas; linguagens de
muito alto nvel. No meio da escala, surgem como elementos reusveis: especificaes;
projetos; arquiteturas; componentes; sistemas baseados em transformao.
Observando-se os softwares v-se que os desenvolvedores fazem reso, na linha de garimpo de cdigo - reso na base da memria, do que se viu, se ouviu. No outro extremo
da escala, os geradores de aplicao, de distncia cognitiva pequena, sofrem a restrio de
atenderem bem a domnios estruturados e conhecidos. Planilha de clculo um exemplo de gerador de aplicaes (cada modelo de clculo uma aplicao).
Portanto resam-se:
Blocos prontos, algumas vezes chamados de componentes (a abordagem de objetos
compara-os a circuitos integrados de software);
Especificaes (abstrao das informaes que um sistema guarda e dos servios que presta);
26 | C++ Explicado e aplicado

C++_CG.indd 26

20/04/2016 11:57:15

Projetos (arquiteturas de soluo, por exemplo, o princpio reativo nas interfaces


GUI que cria uma tabela de eventos e tratadores por programa);
Sistema sob manuteno e que base para um novo.
Reso d ganho de at 4:1 na produtividade. Essa afirmao, bandeira de orientao
a objetos, se baseia na grande interseo para diversos sistemas complementares. Por
exemplo: folha de pagamento, contas a pagar, contas a receber, contabilidade, etc., so
todos sistemas administrativos. Pois bem, a interseo, ou seja, funes que aparecem
em todos, com diferenas mnimas de um para outro chega a 85%. Da justificar-se o
4:1, pois 85% d mais do que 4:1 mas ao se fazer para reso precisa-se fazer melhor.
Um exemplo de biblioteca de componentes, incorporada ao C++, a biblioteca STL
(Standard Template Library). Ela nos dispensa do entediante e em geral pouco eficiente
processo de recodificar vetores, listas, conjuntos e outros contineres. Tudo com um
excelente desempenho.
Um excelente software de apoio ao reso, em ambiente Unix/Linux CodeFinder, e
que traz consigo uma boa discusso sobre a montagem do ambiente de reso.

1.4 Orientao a objetos Conceitos


Ainda na linha de Wirth: conceitos para raciocinar, busca-se na cincia uma base para o
que se faz na orientao a objetos. Essa base existe em trs fontes principais: a Teoria da
Classificao (que organiza os seres em classes), a Teoria da Cognio (discute como se
aprende), e a Ontologia de Bunge (como se representa o ser).
O objetivo de se trazer para o contexto essa parte conceitual se justifica pela necessidade de um critrio de adequao aplicvel aos modelos. Por exemplo, ao se fazer um
sistema de controle acadmico, precisa-se escolher um conjunto de propriedades necessrias para bem representar os atores envolvidos no ambiente, a saber, pessoal administrativo, professores e alunos. Mas at que nvel de detalhe correto descer?
Outro ponto a discusso de processo e mtodo, tratados posteriormente no Captulo 7.
Como depoimento pessoal, estudei esse tpico como parte de minha tese de doutorado e, aps ter adquirido este conhecimento, passei a me sentir bem mais confortvel
ao propor hierarquias de classes para resolver problemas por orientao a objetos. Est
a. Espero que a sensao final do leitor seja semelhante. Isso porque orientao a objetos
no evoluo de programao estruturada, e sim uma revoluo, dado o alto poder de
representao do conceito de objeto.
Mas o sistema de controle acadmico tem muitos outros elementos envolvidos: currculos com suas disciplinas e seu encadeamento; horrios; avaliao e os correspondentes
histricos; recursos fsicos; etc., sem esquecer as regras de negcio, como pr-requisitos,
prazo mximo de trancamento de matrcula, e por a afora.
Tomemos, como exemplo, um aluno: por ser uma pessoa, algumas propriedades so
bsicas, como nome, sexo, data de nascimento, endereo para correspondncia (e hoje
em dia, e-mail). Do ponto de vista acadmico, curso e data de ingresso so propriedades
importantes. Mas, como pessoa, tem vrios outros atributos, como cor dos olhos, sinais
particulares, altura, peso, desempenho em atividades fsicas, e muito mais. Pensando no
sistema de controle acadmico, um erro incluir esses ltimos atributos no modelo de
Conceitua objetos e apresenta c++ | 27

C++_CG.indd 27

20/04/2016 11:57:15

aluno, embora sejam propriedades importantes para pessoas em certos contextos. Conclui-se que uma propriedade relevante, ou no, uma vez dado o contexto, ou seja,
vlida, ou no, numa representao de interesse.
Por outro lado, faz sentido criar uma classe especial, ProfessorAluno, que fatore as
propriedades comuns? Faz sentido pr Pessoa nessa hierarquia, num nvel mais geral,
tal que ProfessorAluno, se pertinente, especializa? Seria bom para Funcionrio, mas o
sistema vai tratar Funcionrio tambm?
Buscando responder a essas perguntas, e usando o princpio de Wirth, pem-se aqui fragmentos da Teoria da Classificao, da Teoria da Cognio, e da Ontologia de Bunge que nos
deem segurana quanto adequao de um dado modelo, antes de sairmos escrevendo cdigo.
O modelo de interesse o de um conjunto de classes que resolva dado problema. E
sabe-se que esse o osso no desenvolvimento orientado a objetos, ou seja, chegar-se a um
conjunto adequado de classes, antes de comear a escrever cdigo, j que muito difcil
alterar-se o conjunto de classes na fase de cdigo (codificar um modelo ainda verde dor
de cabea anunciada).
Todo software tem um ciclo de vida, que inclui:
Anlise: modela um domnio sem preocupaes de implementao (O Que fazer,
sobre quais informaes, para prestar quais servios), mas aps Por Que e Quando;
Projeto: orientado implementao (Como e com que Recursos, armazenar e processar as informaes ao prestar os servios). Precisa-se definir Quem far e Onde
se far cada parte. Projeto pode dividir-se ainda em Projeto Lgico e Projeto Fsico.
Porm, quando se usa orientao a objetos, a distino entre anlise e projeto se torna
menos ntida j que a prpria linguagem em que se vai codificar representa uma restrio muito forte. Isso vem do fato de ser muito difcil trabalhar no alto nvel em que se
raciocina sobre objetos. Pode-se cair na armadilha de fazer uma especificao no implementvel na linguagem alvo. De qualquer forma, a ideia inicial embasar a anlise
orientada a objetos.
Da Teoria da Classificao, usa-se todo o tempo seu princpio bsico:
Organize os elementos em classes com base em semelhanas e diferenas.
Da teoria da cognio, ou seja, de como se aprende, tambm se usa o princpio
bsico, que corresponde lei do menor esforo no aprendizado, ou do cdigo mnimo.
Quanta Ontologia adota-se a linha de Bunge (79) appud Parsons (97), complementada pela teoria da classificao de Smith (81), appud Parsons (97).
A ontologia busca um modelo de representao das espcies. O objetivo bem representar, meta primeira da anlise, embora muitos conceitos sejam comuns s fases de anlise e de projeto. O princpio : um sistema de informaes representa conhecimento
sobre espcies de algum domnio.
Objetos e propriedades: o mundo feito de objetos, com propriedades, embora um
objeto seja mais do que um conjunto de propriedades. Cada propriedade pode ser intrnseca ou mtua. Por exemplo, o peso de um animal intrnseco, mas parceria em
algum evento implica dois seres capazes de cooperar.
28 | C++ Explicado e aplicado

C++_CG.indd 28

20/04/2016 11:57:15