INSIDE C++ Ohjelmoijan käsikirja. Ivor Horton WROX PRESS



Samankaltaiset tiedostot
C++ Vol 1. Stanley B. Lippman Josée Lajoie. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

C++ Ohjelmoijan käsikirja. Hakemisto. #ifdef 394 #ifndef 394, 396 ympäristön tuki 396 koodi, monistamisen välttäminen

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Virtuaalifunktiot ja polymorfismi

Periytyminen. Luokat ja olio-ohjelmointi

Mallit standardi mallikirjasto parametroitu tyyppi

Algoritmit C++ Kauko Kolehmainen

Operaattoreiden uudelleenmäärittely

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

4. Luokan testaus ja käyttö olion kautta 4.1

Ohjelman virheet ja poikkeusten käsittely

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Osoitin ja viittaus C++:ssa

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Osoittimet. Mikä on osoitin?

Ehto- ja toistolauseet

Olio-ohjelmointi Syntaksikokoelma

Standardi mallikirjasto

Omat tietotyypit. Mikä on olio?

Algoritmit 1. Luento 3 Ti Timo Männikkö

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

12 Mallit (Templates)

C++11 lambdat: [](){} Matti Rintala

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Tietotyypit ja operaattorit

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Luokat. Luokat ja olio-ohjelmointi

11/20: Konepelti auki

815338A Ohjelmointikielten periaatteet

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

13 Operaattoreiden ylimäärittelyjä

P e d a c o d e ohjelmointikoulutus verkossa

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

815338A Ohjelmointikielten periaatteet

Kielioppia: toisin kuin Javassa

Perusasiat. Mitkä ovat C++-ohjelman perusosat. Miten lähdeteksti kommentoidaan. Miten lähdetekstistä tulee suoritettava ohjelma

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Harjoitustyö: virtuaalikone

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Luokan operaatiot. Osoittimet ja viittaukset luokan olioihin

Tietueet. Tietueiden määrittely

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

ITKP102 Ohjelmointi 1 (6 op)

7. Oliot ja viitteet 7.1

Tässä dokumentissa kuvataan Keimo-projektissa sovellettavia ohjelmointikäytäntöjä. Päivämäärä Projektiryhmä Keimo

Algoritmit 1. Luento 4 Ke Timo Männikkö

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

812341A Olio-ohjelmointi, I Johdanto

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Java-kielen perusteet

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmoinnin perusteet Y Python

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

7. Näytölle tulostaminen 7.1

C++ Ohjelmoijan käsikirja. Johdanto

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Perustietotyypit ja laskutoimitukset

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Ohjelmoinnin perusteet Y Python

Muutamia peruskäsitteitä

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

etunimi, sukunimi ja opiskelijanumero ja näillä

Valinnat ja päätökset

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Ohjelmointi funktioiden avulla


815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Tieto- ja tallennusrakenteet

Loppukurssin järjestelyt C:n edistyneet piirteet

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Sisältö. 2. Taulukot. Yleistä. Yleistä

Binäärioperaatiot Tiedostot ja I/O

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Binäärioperaatiot Tiedostot ja I/O

Java-kielen perusteet

Lisää perustietotyypeistä

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

A TIETORAKENTEET JA ALGORITMIT

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Algoritmit 2. Luento 14 Ke Timo Männikkö

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

Taulukot. Jukka Harju, Jukka Juslin

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Transkriptio:

INSIDE C++ Ohjelmoijan käsikirja Ivor Horton WROX PRESS

C++ Ohjelmoijan käsikirja Kirjoittanut Kääntäjä Kansi Kustantaja Ivor Horton Jouni Laaksonen Frank Chaumont IT Press PL 25 00511 HELSINKI Sähköpostiosoite Internet palvelu@itpress.fi www.itpress.fi Painopaikka Gummerus Kirjapaino Oy, Jyväskylä 1999 Authorized translation from the English language edition published by Wrox Press Copyright 1998 All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Finnish language edition published by IT Press Copyright 1999. Kaikki oikeudet pidätetään. Tämän julkaisun tai sen osan jäljentäminen ilman tekijän kirjallista lupaa painamalla, monistamalla, äänittämällä tai muulla tavoin on tekijänoikeuslain mukaisesti kielletty. Suomenkielisen version on julkaissut IT Press Copyright 1999. Alkuperäisen teoksen nimi on Ivor Horton s Beginning C++ ISBN 951-826-032-X

Sisältö C++ Ohjelmoijan käsikirja Johdanto 1 Miksi C++? 1 Miksi ANSI/ISO-standardi? 1 Merkintätavat 2 Lähdetekstit 3 CD-levy 4 Virheet ja päivitykset 4 1: Perusasiat 7 Ohjelmointikielet 7 Tulkattu vs. käännetty ohjelman suoritus 8 Kirjastot 9 Miksi C++ on niin suosittu kieli? 9 C++:n ANSI-standardi 10 Yksinkertainen C++-ohjelma 10 Nimet 12 Nimiavaruudet 12 Varatut sanat 13 C++:n lauseet ja lohkot 14 Ohjelman rakenne 14 Suoritettavan tiedoston tekeminen lähdetekstitiedostoista 16 Kääntäminen 17 Linkittäminen 17 Merkit ja merkkijoukot 19 Merkkien koodaus 19 Koodinvaihtomerkit 19 Merkit UCS-merkkijoukossa 22 Tyhjät merkit 22 Ohjelmien kommentointi 23 i

C++ Ohjelmoijan käsikirja Standardikirjasto 25 C++-ohjelmointi 25 Proseduraalinen ja oliopohjainen ohjelmointi 26 Yhteenveto 27 Harjoituksia 28 2: Perustietotyypit ja laskutoimitukset 31 Tieto ja tietotyypit 31 Yksinkertaiset laskutoimitukset 32 Kokonaislukuliteraalit 33 Binääriluvut 33 Heksadesimaaliluvut 34 Negatiiviset binääriluvut 36 Heksadesimaaliset kokonaislukuliteraalivakiot 37 Oktaaliset kokonaislukuliteraalivakiot 38 Kokonaislukulaskenta 39 Tulostuksen ulkoasun muotoilu 42 Muuttujien käyttö 43 Muuttujien nimet 44 Kokonaislukumuuttujat 44 Kokonaislukutyypit 47 Kokonaisluvut muistissa 48 Sijoitusoperaattori 49 Peräkkäiset sijoitukset 51 Muuttujan arvon muuttaminen 51 Sijoitusoperaattorit op= 52 Kokonaisluvun arvon lisäys ja vähennys 53 const-avainsana 54 Liukulukuarvot 56 Liukulukutietotyypit 57 Liukulukuarvojen käsittely 60 Tulostuksen muuntaminen 61 Merkkien käyttö 63 Laajennetut merkkijoukot 65 Alkuarvon asetus funktiomuotoisena 66 ii

Sisältö Yhteenveto 67 Harjoituksia 68 3: Lisää perustietotyypeistä 71 Eri tietotyyppejä sisältävät lausekkeet 71 Sijoitukset ja eri tietotyypit 73 Eksplisiittiset tyypinmuunnokset 73 Vanhantyyliset tyypinmuunnokset 76 Tyyppien tiedot 77 Tietotyyppien raja-arvot 79 Bittioperaattorit 81 Bittien siirto-operaattori 81 Etumerkillisten kokonaislukujen bittisiirto 83 Bittitason loogiset operaattorit 84 Bittitason AND-operaattori 84 Bittitason OR 86 Bittitason poissulkeva OR 87 Lisää muokkausfunktioista 92 Luetellut tietotyypit 93 Nimettömät luetellut tietotyypit 95 Tyypinmuunnokset kokonaislukujen ja lueteltujen tietotyyppien välillä 96 Tietotyyppien synonyymit 98 Muuttujan elinaika 99 Automaattiset muuttujat 100 Muuttujan määrittelyjen sijainti 102 Globaalit muuttujat 102 Staattiset muuttujat 105 Erikoismuokkausfunktiot 106 Ulkoisten muuttujien määrittely 106 Suoritusjärjestys ja laskemissuunta 107 Yhteenveto 108 Harjoituksia 109 4: Valinnat ja päätökset 111 Tiedon vertailu 111 Vertailuoperaattoreiden käyttö 112 iii

iv C++ Ohjelmoijan käsikirja Liukulukuarvojen vertailu 114 If-lause 115 Sisäkkäiset if-lauseet 117 Merkkien koodauksesta riippumaton merkkien käsittely 119 if-else -lause 122 Sisäkkäiset if-else -lauseet 125 Sisäkkäiset if-lauseet 126 Loogiset operaattorit 127 Looginen AND 128 Looginen OR 128 Looginen NOT 129 Ehto-operaattori 131 switch-lause 134 Ehdoton hyppykäsky 139 Valintalauseiden lohkot ja muuttujien näkyvyysalue 139 Yhteenveto 141 Harjoituksia 142 5: Silmukat 145 Silmukoiden perusteet 145 while-silmukka 147 do-while -silmukka 149 Monimutkaisemmat while-silmukan ehtolauseet 151 for-silmukka 152 Silmukat ja muuttujien näkyvyysalue 155 for-silmukat ANSI -yhteensopimattomissa kääntäjissä 155 for-silmukan suorituksen kontrolloiminen liukuluvuilla 156 Monimutkaisten silmukan kontrollointilausekkeiden käyttö 160 Pilkku-operaattori 162 Sisäkkäiset silmukat 163 Silmukan lauseiden yli hyppääminen 167 Silmukasta poistuminen 170 Päättymättömät silmukat 170 Yhteenveto 175 Harjoituksia 176

Sisältö 6: Taulukot ja merkkijonot 179 Taulukot 179 Taulukon käyttö 180 Taikanumeroiden välttäminen 184 Taulukoiden alustaminen 184 Taulukon alkioiden alustaminen nollaksi 186 Taulukon koon määrittely alkuarvoluettelolla 186 Taulukon alkioiden lukumäärän laskeminen 186 Merkkitaulukot 188 Moniulotteiset taulukot 192 Moniulotteisten taulukoiden alustus 194 Ulottuvuuden määrittely oletusarvoisesti 196 Moniulotteiset merkkitaulukot 197 Paremmat merkkijonot 199 string-tyyppisten olioiden esittely 200 string-olioden käsittely 201 Merkkijonojen yhdistäminen 202 Merkkijonon yksittäisten merkkien käsittely 204 Merkkijonon osien käsittely 206 Merkkijonojen vertailu 207 compare()-funktio 210 Merkkijonon etsintä 212 Merkkijoukon merkkien etsintä merkkijonosta 215 Etsiminen taaksepäin 219 Merkkijonon muuttaminen 220 Merkkijonon lisäys 221 Ali-merkkijonon korvaus 222 Merkkien poisto merkkijonosta 225 string-tyyppiset taulukot 226 Yhteenveto 227 Harjoituksia 228 7: Osoittimet 231 Mikä on osoitin? 231 Osoittimen esittely 232 Osoittimien käyttö 233 Osoite-operaattori 233 Osoitus-operaattori 234 v

vi C++ Ohjelmoijan käsikirja Miksi käyttää osoittimia? 235 Osoittimien alustus 238 char-tyyppisten osoittimien alustus 239 Merkkijonojen lajittelu osoittimien avulla 244 Tulostuksen ulkoasun parantaminen 248 Osoitinvakiot ja osoittimet vakioihin 248 Osoittimet ja taulukot 250 Osoitinlaskenta 251 Kahden osoittimen välisen eron laskeminen 253 Osoitinmuodon käyttö taulukon nimen yhteydessä 253 Osoittimien käyttö moniulotteisten taulukoiden yhteydessä 257 Osoitinmuodon käyttö moniulotteisen taulukon nimen yhteydessä 257 Operaatiot C-tyylisten merkkijonojen yhteydessä 260 Merkkijonojen yhdistäminen 260 Dynaaminen muistinvaraus 261 Vapaa muisti eli keko 262 Operaattorit new ja delete 263 Taulukoiden dynaaminen muistinvaraus 264 Dynaamisen muistinvarauksen vaarat 266 Muistivuodot 267 Osoittimet ja muuttujien näkyvyysalue 267 Vapaan muistin pirstoutuminen 267 Monirivisen merkkijonon sanojen lukeminen ja laskeminen 268 Sanojen osoitintaulukon luominen 269 string-tyyppisten olioiden luonti sanoja varten 270 Sanojen lajittelu ja tulostus 270 Muistin vapauttaminen 271 Osoittimien muuntaminen 272 Yhteenveto 273 Harjoituksia 274 8: Ohjelmointi funktioiden avulla 277 Ohjelman jakaminen osiin 277 Miksi ohjelmat tulee jakaa osiin 278 Funktioiden perusteet 279 Funktion määrittely 280 Funktion otsikko 280

Sisältö Funktion otsikon yleinen muoto 280 Funktion runko 281 Parametrit 282 Paluuarvot 283 return-lause 284 Funktion esittely 284 Funktion prototyyppi 285 Funktion prototyypin käyttö 286 Parametrien välitys funktiolle 287 Arvoparametrit 287 Osoittimen välitys funktiolle 289 Taulukoiden välitys funktiolle 291 const-tyyppiset parametrit 294 Moniulotteisen taulukon välittäminen funktiolle 295 Viittausparametrit 297 const-viittausten käyttö 299 Viittaukset vs. osoittimet 300 Viittausten esittely 300 main()-funktion parametrit 301 Parametrin oletusarvot 302 Useiden parametrien oletusarvot 303 Arvon palauttaminen funktiosta 306 Osoittimen palauttaminen 306 Viittauksen palauttaminen 311 Uuden muuttujan palauttaminen funktiosta 311 Avoimet funktiot 312 Staattiset muuttujat 312 Yhteenveto 315 Harjoituksia 316 9: Lisää funktioista 319 Funktioiden uudelleenmäärittely 319 Funktion allekirjoitus 320 Uudelleenmäärittely ja osoitinparametrit 322 Uudelleenmäärittely ja viittausparametrit 322 Uudelleenmäärittely ja const-parametrit 324 Uudelleenmäärittely ja const-tyyppinen osoitinparametri 325 Uudelleenmäärittely ja viittausparametrit 325 Uudelleenmäärittely ja parametrien oletusarvot 326 vii

viii C++ Ohjelmoijan käsikirja Mallifunktiot 326 Malliparametrin määrittely eksplisiittisesti 330 Erikoistuneet mallifunktiot 332 Erikoistuneen mallifunktion määrittely 332 Mallifunktiot ja uudelleenmäärittely 334 Mallifunktio, jolla on monta malliparametriä 335 Muut kuin tietotyyppiä olevat malliparametrit 336 Osoittimet funktioihin 337 Funktio-osoittimen esittely 338 Funktion välittäminen parametrinä 341 Funktio-osoitintaulukot 343 Rekursio 344 Rekursion käyttö 346 Lajittelun toteuttaminen rekursiivisesti 347 Yhteenveto 353 Harjoituksia 354 10: Ohjelmatiedostot ja esikääntäjä 357 Ohjelmatiedostojen käsittely 357 Ohjelmatiedostot ja linkitys 359 Ulkoiset muuttujat 360 Toisessa tiedostossa olevan const-muuttujan käsittely 362 Nimiavaruudet 365 Globaali nimiavaruus 366 Nimiavaruuksien esittely 366 Nimien nimiavaruuden määrittely implisiittisesti 370 using-esittelyjen käyttö 371 Funktiot ja nimiavaruudet 372 Mallifunktiot ja nimiavaruudet 376 Nimiavaruuden laajennukset 378 Nimettömät nimiavaruudet 381 Nimiavaruuksien peitenimet 382 Sisäkkäiset nimiavaruudet 382 Esikääntäjä 383 Otsikkotiedostojen sisällyttäminen ohjelmiin 384 Korvaukset ohjelman koodissa 386 Merkkijonojen poistaminen ohjelmasta 387

Sisältö Tunnisteen määrittelyalueen päättäminen 387 Makrokorvaukset 388 Makrot voivat aiheuttaa virheitä 389 Moniriviset esikääntäjäkomennot 390 Merkkijonot makron parametreinä 391 Parametrien yhdistäminen 392 Loogiset esikääntäjäkomennot 393 Looginen #if-komento 393 Koodin monistamisen välttäminen 394 Arvojen testauksen komennot 396 Koodin valinta monista vaihtoehdoista 397 Esikääntäjän standardimakrot 398 #error- ja #pragma-komennot 399 Testausmenetelmät 399 Itegroidut debuggerit 400 Testaus esikääntäjän avulla 400 assert-makron käyttö 407 Yhteenveto 409 Harjoituksia 410 11: Omat tietotyypit 413 Mikä on olio? 413 C++:n struktuurit 415 Struktuurit 415 Struktuurin määrittely 416 Struktuuriolion esittely 417 Struktuurimuuttujan alustus 418 Struktuurimuuttujan jäsenten käsittely 419 Struktuurin jäsenfunktiot 423 Jäsenfunktion määrittelyn sijoittaminen 424 Osoittimien käyttö struktuurien yhteydessä 425 Jäsenmuuttujien käsittelyn osoittimien avulla 425 Jäseneen osoitus -operaattori 426 Olio-osoittimien käyttötilanteet 428 Unionit 429 Unionien esittely 430 Nimettömät unionit 432 Monimutkaisemmat struktuurit 432 ix

C++ Ohjelmoijan käsikirja Struktuurit struktuurin jäsenenä 434 Yhteenveto 440 Harjoituksia 440 x 12: Luokat 443 Luokat ja olio-ohjelmointi 443 Kapselointi 444 Tiedon kätkentä 445 Perityminen 446 Polymorfismi 447 Terminologiaa 448 Luokan määrittely 449 Muodostinfunktiot 452 Muodostinfunktion määrittelyn sijoittaminen luokan ulkopuolelle 454 Oletusmuodostinfunktio 456 Oletusarvoiset alkuarvot 460 Alkuarvolistan käyttö muodostinfunktiossa 461 explicit-avainsanan käyttö 461 Luokan yksityiset jäsenet 463 Yksityisten jäsenten käyttö 467 Oletuskopiomuodostin 469 Ystävät 470 Luokan ystäväfunktiot 471 Ystäväluokat 474 this -osoitin 474 Vakiotyyppiset oliot ja jäsenfunktiot 478 Luokan muuttuvat jäsenmuuttujat 480 const-määreen vaikutuksen poistaminen 481 Luokan olioiden taulukko 481 Luokan olion koko 484 Luokan staattiset jäsenet 486 Luokan staattiset jäsenmuuttujat 487 Staattisen jäsenmuuttujan käsittely 490 Staattisen jäsenmuuttujan tyyppi 491 Luokan staattiset jäsenfunktiot 492

Sisältö Yhteenveto 493 Harjoituksia 494 13: Luokan operaatiot 497 Osoittimet ja viittaukset luokan olioihin 497 Osoittimet jäsenmuuttujina 498 Paketti-luokan määrittely 500 AutoKuorma-luokan määrittely 503 AutoKuorma-luokan toteutus 504 Jäsenfunktioiden määrittely 505 Luokan käsittelyn kontrollointi 513 Sisäkkäiset luokat 513 515 Sisäkkäiset luokat ja julkinen saantitapa 515 Ystäväluokat 515 Kopiomuodostimen tärkeys 515 Kopiomuodostimen toteuttaminen 516 Viittausparametrit 517 Dynaaminen muistinvaraus oliossa 522 Mikä on tuhoajafunktio? 522 Olioiden tuhoaminen 522 Tuhoajafunktio 523 Oletustuhoajafunktio 523 Tuhoajafunktion toteuttaminen 525 Viittaukset luokassa 527 Viittaukset luokan jäsenmuuttujina 527 Yhteenveto 530 Harjoituksia 531 14: Operaattoreiden uudelleenmäärittely 533 Operaattoreiden toteutus luokille 533 Operaattoreiden uudelleenmäärittely 534 Operaattorit, jotka voidaan uudelleenmääritellä 534 Uudelleenmääritellyn operaattorin toteutus 535 xi

xii C++ Ohjelmoijan käsikirja Globaalit operaattorifunktiot 539 Operaattorin täydellinen toteuttaminen 539 Erilaiset operaattorifunktiot 543 Sijoitusoperaattorin uudelleenmäärittely 544 Sijoitusoperaattorin toteuttaminen 545 Aritmeettisten operaattoreiden uudelleenmäärittely 551 Operaattorin toteutus perustuen toiseen operaattoriin 556 Indeksointioperaattorin uudelleenmäärittely 557 L-arvo ja uudelleenmääritelty indeksointioperaattori 563 const-tyyppinen uudelleenmäärittely 564 Tyypinmuunnosten uudelleenmäärittely 564 Kaksimerkityksiset muunnokset 565 Lisäys- ja vähennysoperaattoreiden uudelleenmäärittely 566 Fiksut osoittimet 566 Fiksun osoittimen määrittely Laatikko-olioille 567 Fiksun osoitinluokan toteuttaminen 570 new ja delete -operaattorien uudelleenmäärittely 573 Yhteenveto 574 Harjoituksia 575 15: Periytyminen 577 Luokat ja olio-ohjelmointi 577 Hierarkiat 578 Luokkien periytyvyys 579 Periytyminen vs. kerääminen 580 Luokkien periyttäminen kantaluokasta 581 Jäsenten saantitapa perinnässä 584 Luokan jäsenten esittely suojatuiksi 588 Perittyjen jäsenten saantitavat 590 Saantitavan hallintakomentojen käyttö luokkien hierarkiassa 592 Perittyjen jäsenten saantitavan muuttaminen 593 Muodostinfunktioiden toiminta periytetyssä luokassa 595 Periytetyn luokan kopiomuodostin 599 Tuhoajafunktiot periytymisessä 602 Saman nimiset jäsenet 605 Saman nimiset jäsenfunktiot 606 Moniperintä 607

Sisältö Monta kantaluokkaa 607 Perityn jäsenen monimerkityksisyys 608 Toistuva perintä 614 Virtuaaliset kantaluokat 616 Muunnokset luokkien tyyppien välillä 617 Yhteenveto 618 Harjoituksia 619 16: Virtuaalifunktiot ja polymorfismi 621 Polymorfismin perusteet 621 Osoitin kantaluokkaan 622 Perittyjen funktioiden kutsuminen 624 Virtuaalifunktiot 628 Virtuaalifunktion vaatimukset 632 Virtuaalifunktiot ja luokkahierarkia 633 Saantitavat ja virtuaalifunktiot 634 Parametrien oletusarvot virtuaalifunktioissa 636 Viittausten käyttö kutsuttaessa virtuaalifunktioita 637 Virtuaalifunktion kantaluokan version kutsuminen 639 Olioiden osoittimien muuntaminen 640 Dynaaminen muunnos 642 Osoittimien dynaamiset muunnokset 642 Viittausten muuntaminen 644 Polymorfismin kustannukset 644 Puhtaat virtuaalifunktiot 645 Abstraktit luokat 646 Abstrakti luokka rajapintana 649 Epäsuorat abstraktit kantaluokat 649 Olioiden tuhoaminen osoittimien avulla 653 Virtuaaliset tuhoajafunktiot 654 Tyyppien tunnistus suoritusaikana 656 Osoittimet luokan jäseniin 657 Osoittimet jäsenmuuttujiin 657 Osoitin jäseneen -valintaoperaattori 659 Osoittimet jäsenfunktioihin 661 Osoittimen jäseneen välittäminen funktiolle 665 Yhteenveto 666 xiii

xiv C++ Ohjelmoijan käsikirja Harjoituksia 667 17: Ohjelman virheet ja poikkeusten käsittely 669 Virheiden käsittely 669 Mitä poikkeukset ovat? 670 Poikkeuksen muodostaminen 671 Poikkeusten käsittely 674 Käsittelemättömät poikkeukset 675 Poikkeuksen muodostava koodi 676 Sisäkkäiset try-lohkot 678 Luokkaoliot poikkeuksina 681 Oikean catch-käsittelijän valinta 683 Periytetyn luokan poikkeuksen käsittely kantaluokan käsittelijällä 687 Poikkeuksen uudelleenmuodostaminen 689 Kaikkien poikkeusten käsittely 693 Poikkeuksia muodostavat funktiot 695 Funktion try-lohko 695 Funktiossa mahdollisesti muodostettavien poikkeusten määrittely 696 Yllättävät poikkeukset 697 Poikkeusten muodostaminen muodostinfunktioissa 698 Poikkeukset ja tuhoajafunktiot 699 Standardikirjaston poikkeukset 700 Standardikirjaston poikkeusluokat 701 Standardipoikkeusten käyttö 702 Omien poikkeusluokkien periyttäminen 702 Yhteenveto 703 Harjoituksia 704 18: Mallit 707 Malliluokka 707 Mallien käyttökohteet 708 Mallien määrittely 709 Malliparametrit 709 Yksinkertainen malli 710 Mallin jäsenmuuttujien määrittely 712

Sisältö Mallin ilmentymien luominen 715 Mallien vienti 722 Mallin staattiset jäsenet 723 Mallin ei-tyyppiparametrit 724 Ei-tyyppiparametrien esimerkki 725 Jäsenfunktioiden mallit 726 Ei-tyyppiparametrien arvot 728 Osoittimet ja taulukot ei-tyyppiparametreinä 729 Malliparametrien oletusarvot 736 Mallin ilmentymän eksplisiittinen muodostus 736 Mallin ystävät 737 Erikoistapaukset 739 Osittain erikoistuneet mallit 739 Osittain erikoistuneen mallin valinta 740 Mallit ja sisäkkäiset luokat 741 Mallifunktioiden määrittely 743 Kehittyneemmät mallit 750 Yhteenveto 751 Harjoituksia 752 19: Syöttö- ja tulostusoperaatiot 755 C++:n syöttö ja tulostus 755 Virrat 756 Virtaluokat 758 Standardivirrat 759 Virtojen <<- ja >>-operaattorit 759 Virtojen >>-operaattori 760 Virtojen <<-operaattori 761 Virtojen muokkausfunktiot 762 Parametrilliset muokkausfunktiot 763 Tiedostovirrat 764 Tiedostoon kirjoittaminen 765 Tiedostosta lukeminen 767 Tiedoston avaustavan asetus 770 Virran nykyisen sijainnin käsittely 777 Muotoilemattomat virtaoperaatiot 779 Muotoilematon syöttövirta 780 xv

xvi C++ Ohjelmoijan käsikirja Muotoilematon tulostusvirta 782 Virtojen syötön/tulostuksen virheet 782 I/O-virheet ja poikkeukset 784 Binäärimuotoiset virtaoperaatiot 784 Numeerisen tiedon kirjoitus binäärimuodossa 788 Virran luku/kirjoitus -operaatiot 793 Virran hajasaanti 794 Binäärivirran hajasaanti 794 Merkkijonovirrat 801 Oliot ja virrat 803 <<-operaattorin uudelleenmäärittely olioille 803 <<-operaattorin uudelleenmäärittely olioille 806 Monimutkaisemmat oliot ja virrat 808 Virtojen tuki malleille 811 <<-operaattorin käyttö Pino-mallissa 812 >>-operaattorin käyttö Pino-mallissa 814 Pinon olioiden käsittely 815 Yhteenveto 820 Harjoituksia 821 20: Standardi mallikirjasto 823 STL:n arkkitehtuurin perusteet 823 STL:n otsikkotiedostot 825 vector-säiliön käyttö 826 vector-säiliön perusoperaatiot 828 vector-säiliön käyttö taulukko-operaatioissa 834 Keskiarvon laskeminen iteraattoreiden avulla 835 Mallitaulukko-vaihtoehto 838 Iteraattori istream_iterator 839 Toiminnallisuutta sisältävät istream_iterator-iteraattorit 841 Lisää iteraattoreista 842 Iteraattorit 842 Iteraattoreiden välitys algoritmille 845 istream_operator:n ja ostream_operator:n jäljittely 847 Iteraattoreiden vaatimukset 848 Parempi Kokonaisluku-iteraattori 849 Syöttö- ja tulostusiteraattorit 855

Sisältö Tähän saakka käsittelemämme aiheet 857 Muistinkäsittely 857 Apuluokka Laskuri 858 STL:n vaatimukset säiliön alkiolle 860 Säiliöalkion vaatimukset 861 vector-säiliön ja sen muistinhallinnan tarkastelu 863 Kuinka se toimii: Muodostinfunktion testit 864 Koon muutto -testit 865 Lisää koon muutto -testejä 866 Lisäys alkuun ja loppuun -testit 867 Sijoitus- ja vertailutestit 867 list-säiliö 868 Kommentteja list-säiliöstä 874 Assosiatiivinen map-säiliö 875 Suorituskyky ja erikoistuminen 881 Yhteenveto 883 Harjoituksia 883 A: ASCII-koodit 885 ASCII Merkit 0-31 885 ASCII Merkit 32-127 886 B: C++:n varatut sanat 889 C: Standardikirjaston otsikkotiedostot 893 Kielen tuki 893 Syöttö/Tulostus 894 Diagnostiikka 894 Yleiset välineet 895 Merkkijonot 895 Säiliöt 895 Iteraattorit 896 Algoritmit 896 Numeeriset operaatiot 897 Paikallistaminen 897 xvii

C++ Ohjelmoijan käsikirja D: Operaattoreiden suoritusjärjestys 899 E: Esimerkkiprojekti 903 Hahmotelma 903 Projektin määrittelyn parantelu 905 Suunnittelijan huomiot 905 Henkilo-luokka 906 Periytetyt luokat Opiskelija ja Opettaja 906 Säiliö 906 Tietojen talletus ja palautus 907 Yhteenveto 907 Hakemisto 909 xviii

Sisältö xix

xx C++ Ohjelmoijan käsikirja