Professional Documents
Culture Documents
C++11 e C++14
Explicado
e aplicado
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
Dedicatria
C++_CG.indd 7
20/04/2016 11:57:14
Introduo
C++_CG.indd 1
20/04/2016 11:57:14
SUMRIO
CAPTULO 1
19
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
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
C++_CG.indd 4
20/04/2016 11:57:14
C++_CG.indd 5
20/04/2016 11:57:14
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
C++_CG.indd 6
20/04/2016 11:57:14
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
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
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
C++_CG.indd 11
20/04/2016 11:57:14
421
C++_CG.indd 12
20/04/2016 11:57: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
C++_CG.indd 13
20/04/2016 11:57:14
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
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
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
CAPTULO 7
607
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
C++_CG.indd 16
20/04/2016 11:57:15
CAPTULO 8
629
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
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
647
647
651
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.
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)
C++_CG.indd 20
20/04/2016 11:57:15
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 =
1 (menos significativo)
0
1
1
0
0
1
0
1
1 (mais significativo)
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
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
+
0
1
0
0
1
1
1
(0 vai 1)
Tabela da
soma na base 2
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.
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
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
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.
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)
Linguagem de
alto nvel
Linguagem de
muito alto nvel
Sistemas baseados em
transformao
Geradores
de aplicao
C++_CG.indd 26
20/04/2016 11:57:15
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