Sisällys

Esipuhe: Sirkkelin käyttöohje

Alkusanat neljänteen, uudistettuun painokseen

1 Kohti olioita

  1.1 Ohjelmistojen tekijöiden ongelmakenttä

  1.2 Laajojen ohjelmistojen teon vaikeus

  1.3 Suurten ohjelmistokokonaisuuksien hallinta

    1.3.1 Ennen kehittyneitä ohjelmointikieliä

    1.3.2 Tietorakenteet

    1.3.3 Moduulit

    1.3.4 Oliot

    1.3.5 Komponentit

  1.4 C++: Moduulit käännösyksiköillä

  1.5 C++: Nimiavaruudet

    1.5.1 Nimiavaruuksien määritteleminen

    1.5.2 Näkyvyystarkenninoperaattori

    1.5.3 Nimiavaruuksien hyödyt

    1.5.4 std-nimiavaruus

    1.5.5 Standardin uudet otsikkotiedostot

    1.5.6 Nimiavaruuden synonyymi

    1.5.7 Lyhyiden nimien käyttö (using)

    1.5.8 Nimeämätön nimiavaruus

  1.6 Moduulituki muissa ohjelmointikielissä

    1.6.1 Modula-3

    1.6.2 Java

2 Luokat ja oliot

  2.1 Olioiden ominaisuuksia

    2.1.1 Oliolla on tila

    2.1.2 Olio kuuluu luokkaan

    2.1.3 Oliolla on identiteetti

  2.2 Luokan dualismi

  2.3 C++: Luokat ja oliot

    2.3.1 Luokan esittely

    2.3.2 Jäsenmuuttujat

    2.3.3 Jäsenfunktiot

    2.3.4 Luokkien ja olioiden käyttö C++:ssa

3 Olioiden elinkaari

  3.1 Olion syntymä

  3.2 Olion kuolema

  3.3 Olion elinkaaren määräytyminen

    3.3.1 Modula-3

    3.3.2 Smalltalk

    3.3.3 Java

    3.3.4 C++

  3.4 C++: Rakentajat ja purkajat

    3.4.1 Rakentajat

    3.4.2 Purkajat

  3.5 C++: Dynaaminen luominen ja tuhoaminen

    3.5.1 new

    3.5.2 delete

    3.5.3 Dynaamisesti luodut taulukot

    3.5.4 Virheiden välttäminen dynaamisessa luomisessa

4 Olioiden rajapinnat

  4.1 Rajapinnan suunnittelu

    4.1.1 Hyvän rajapinnan tunnusmerkkejä

    4.1.2 Erilaisia rajapintoja ohjelmoinnissa

    4.1.3 Rajapintadokumentaation tuottaminen ja ylläpito

  4.2 C++: Näkyvyysmääreet

    4.2.1 public

    4.2.2 private

  4.3 C++: const ja vakio-oliot

    4.3.1 Perustyyppiset vakiot

    4.3.2 Vakio-oliot

    4.3.3 Vakioviitteet ja -osoittimet

  4.4 C++: Luokan ennakkoesittely

    4.4.1 Ennakkoesittely kapseloinnissa

5 Oliosuunnittelu

  5.1 Oliosuunnittelua ohjaavat ominaisuudet

    5.1.1 Mitä suunnittelu on?

    5.1.2 Abstraktio ja tiedon kätkentä

    5.1.3 Osien väliset yhteydet ja lokaalisuusperiaate

    5.1.4 Laatu

  5.2 Oliosuunnittelun aloittaminen

    5.2.1 Luokan vastuualue

    5.2.2 Kuinka löytää luokkia?

    5.2.3 CRC-kortti

    5.2.4 Luokka, attribuutti vai operaatio?

  5.3 Oliosuunnitelman graafinen kuvaus

    5.3.1 UML:n historiaa

    5.3.2 Luokat, oliot ja rajapinnat

    5.3.3 Luokkien väliset yhteydet

    5.3.4 Ajoaikaisen käyttäytymisen kuvaamistapoja

    5.3.5 Ohjelmiston rakennekuvaukset

  5.4 Saatteeksi suunnitteluun

6 Periytyminen

  6.1 Periytyminen, luokkahierarkiat ja polymorfismi

  6.2 Periytyminen ja uudelleenkäyttö

  6.3 C++: Periytymisen perusteet

    6.3.1 Periytyminen ja näkyvyys

    6.3.2 Periytyminen ja rakentajat

    6.3.3 Periytyminen ja purkajat

    6.3.4 Aliluokan olion ja kantaluokan suhde

  6.4 C++: Periytymisen käyttö laajentamiseen

  6.5 C++: Virtuaalifunktiot ja dynaaminen sitominen

    6.5.1 Virtuaalifunktiot

    6.5.2 Dynaaminen sitominen

    6.5.3 Olion tyypin ajoaikainen tarkastaminen

    6.5.4 Ei-virtuaalifunktiot ja peittäminen

    6.5.5 Virtuaalipurkajat

    6.5.6 Virtuaalifunktioiden hinta

    6.5.7 Virtuaalifunktiot rakentajissa ja purkajissa

  6.6 Abstraktit kantaluokat

  6.7 Moniperiytyminen

    6.7.1 Moniperiytymisen idea

    6.7.2 Moniperiytyminen eri oliokielissä

    6.7.3 Moniperiytymisen käyttökohteita

    6.7.4 Moniperiytymisen vaaroja

    6.7.5 Vaihtoehtoja moniperiytymiselle

  6.8 C++: Moniperiytyminen

    6.8.1 Moniperiytyminen ja moniselitteisyys

    6.8.2 Toistuva moniperiytyminen

  6.9 Periytyminen ja rajapintaluokat

    6.9.1 Rajapintaluokkien käyttö

    6.9.2 C++: Rajapintaluokat ja moniperiytyminen

    6.9.3 Ongelmia rajapintaluokkien käytössä

  6.10 Periytyminen vai kooste?

  6.11 Sovelluskehykset

7 Lisää olioiden elinkaaresta

  7.1 Olioiden kopiointi

    7.1.1 Erilaiset kopiointitavat

    7.1.2 C++: Kopiorakentaja

    7.1.3 Kopiointi ja viipaloituminen

  7.2 Olioiden sijoittaminen

    7.2.1 Sijoituksen ja kopioinnin erot

    7.2.2 C++: Sijoitusoperaattori

    7.2.3 Sijoitus ja viipaloituminen

  7.3 Oliot arvoparametreina ja paluuarvoina

  7.4 Tyyppimuunnokset

    7.4.1 C++:n tyyppimuunnosoperaattorit

    7.4.2 Ohjelmoijan määrittelemät tyyppimuunnokset

  7.5 Rakentajat ja struct

8 Lisää rajapinnoista

  8.1 Sopimus rajapinnasta

    8.1.1 Palveluiden esi- ja jälkiehdot

    8.1.2 Luokkainvariantti

    8.1.3 Sopimussuunnittelun käyttö

    8.1.4 C++: luokan sopimusten tarkastus

  8.2 Luokan rajapinta ja olion rajapinta

    8.2.1 Metaluokat ja luokkaoliot

    8.2.2 C++: Luokkamuuttujat

    8.2.3 C++: Luokkafunktiot

  8.3 Tyypit osana rajapintaa

  8.4 Ohjelmakomponentin sisäiset rajapinnat

    8.4.1 C++: Ystäväfunktiot

    8.4.2 C++: Ystäväluokat

9 Geneerisyys

  9.1 Yleiskäyttöisyys, pysyvyys ja vaihtelevuus

  9.2 Suunnittelun geneerisyys - suunnittelumallit

    9.2.1 Suunnittelumallien edut ja haitat

    9.2.2 Suunnittelumallin rakenne

  9.3 Valikoituja esimerkkejä suunnittelumalleista

    9.3.1 Kokoelma (Composite)

    9.3.2 Iteraattori (Iterator)

    9.3.3 Silta (Bridge)

    9.3.4 C++: Esimerkki suunnittelumallin toteutuksesta

  9.4 Geneerisyys ja periytymisen rajoitukset

  9.5 C++: Toteutuksen geneerisyys - mallit (template)

    9.5.1 Mallit ja tyyppiparametrit

    9.5.2 Funktiomallit

    9.5.3 Luokkamallit

    9.5.4 Tyyppiparametreille asetetut vaatimukset

    9.5.5 Erilaiset mallien parametrit

    9.5.6 Mallien erikoistus

    9.5.7 Mallien ongelmia ja ratkaisuja

10 Geneerinen ohjelmointi - STL ja metaohjelmointi

  10.1 STL:n perusperiaatteita

    10.1.1 STL:n rakenne

    10.1.2 Algoritmien geneerisyys

    10.1.3 Tietorakenteiden jaotteluperusteet

    10.1.4 Tehokkuuskategoriat

  10.2 STL:n säiliöt

    10.2.1 Sarjat - "peräkkäissäiliöt"

    10.2.2 Assosiatiiviset säiliöt

    10.2.3 Muita säiliöitä

  10.3 Iteraattorit

    10.3.1 Iteraattoreiden käyttökohteet

    10.3.2 Iteraattorikategoriat

    10.3.3 Iteraattorit ja säiliöt

    10.3.4 Iteraattoreiden kelvollisuus

    10.3.5 Iteraattorisovittimet

  10.4 STL:n algoritmit

  10.5 Funktio-oliot

    10.5.1 Toiminnallisuuden välittäminen algoritmille

    10.5.2 Funktio-olioiden periaate

    10.5.3 STL:n valmiit funktio-oliot

  10.6 C++: Template-metaohjelmointi

    10.6.1 Metaohjelmoinnin käsite

    10.6.2 Metaohjelmointi ja geneerisyys

    10.6.3 Metafunktiot

    10.6.4 Esimerkki metafunktioista: numeric_limits

    10.6.5 Esimerkki metaohjelmoinnista: tyypin valinta

    10.6.6 Esimerkki metaohjelmoinnista: optimointi

11 Virhetilanteet ja poikkeukset

  11.1 Mikä virhe on?

  11.2 Mitä tehdä virhetilanteessa?

  11.3 Virhehierarkiat

  11.4 Poikkeusten heittäminen ja sieppaaminen

    11.4.1 Poikkeushierarkian hyväksikäyttö

    11.4.2 Poikkeukset, joita ei oteta kiinni

    11.4.3 Sisäkkäiset valvontalohkot

  11.5 Poikkeukset ja olioiden tuhoaminen

    11.5.1 Poikkeukset ja purkajat

    11.5.2 Poikkeukset ja dynaamisesti luodut oliot

  11.6 Poikkeusmääreet

  11.7 Muistivuotojen välttäminen - auto_ptr

    11.7.1 Automaattiosoittimet ja muistinhallinta

    11.7.2 Automaattiosoittimien sijoitus ja kopiointi

    11.7.3 Automaattiosoittimien käytön rajoitukset

  11.8 Olio-ohjelmointi ja poikkeusturvallisuus

    11.8.1 Poikkeustakuut

    11.8.2 Poikkeukset ja rakentajat

    11.8.3 Poikkeukset ja purkajat

  11.9 Esimerkki: poikkeusturvallinen sijoitus

    11.9.1 Ensimmäinen versio

    11.9.2 Tavoitteena vahva takuu

    11.9.3 Lisätään epäsuoruutta

    11.9.4 Tilan eriyttäminen ("pimpl"-idiomi)

    11.9.5 Tilan vaihtaminen päikseen

Liite A. C++: Ei-olio-ominaisuuksia

   A.1 Viitteet

   A.2 inline

   A.3 vector

   A.4 string

Liite B. C++-tyyliopas

Kirjallisuutta

Englanninkieliset termit

Hakemisto