C++

Kohteesta Wikipedia
Loikkaa: valikkoon, hakuun
C++
Paradigma moniparadigmainen; proseduraalinen, olio-ohjelmointi, funktionaalinen, geneerinen
Tyypitys vahva, staattinen
Yleinen suoritusmalli käännettävä
Muistinhallinta manuaalinen, RAII
Julkaistu 1983
Kehittäjä Bjarne Stroustrup
Vakaa versio ISO/IEC 14882:2014[1]
Merkittävimmät toteutukset GCC, Visual C++, LLVM/Clang, Intel C/C++, Borland C++, IBM XL C++
Vaikutteet C, Ada, Simula, CLU
Vaikuttanut Java, C99, D, C#, Rust
Käyttöjärjestelmä alustariippumaton
Uutisryhmä comp.lang.c++

C++ on ohjelmointikieli, jonka Bjarne Stroustrup kehitti 1980-luvulla. Kieli on kehitetty C-kielestä lisäämällä siihen muun muassa olio-ohjelmointiin ja geneerisyyteen liittyviä ominaisuuksia.[2][3]

C++-kielen standardi ISO/IEC 14882:1998 vahvistettiin vuonna 1998,[4] C++11 (ent. C++0x) vuonna 2011,[5] uusin standardi C++14 (ISO/IEC 14882:2014) vuonna 2014.[1] Seuraavan standardin odotetaan valmistuvan vuonna 2017.[6]

C++ sisältää muun muassa luokat, virtuaalisen moniperintätuen, mallit (templates) ja poikkeukset. C++ perustuu C-kieleen siten, ettei kieltä ole suunniteltu uudelleen, vaan uusia ominaisuuksia on lisätty.[7] Kieli on moniparadigmainen, mahdollistaen muun muassa proseduraalisen-, olio- ja funktionaalisen ohjelmoinnin.

Muistihallinta on suunniteltu RAII (engl. Resource acquisition is initialization) konseptille, joka soveltuu mm. poikkeuksien kanssa käyttöön.[8]

C++:lla on kirjoitettu suuri osa maailman käyttöjärjestelmä-, laiteohjain-, ohjelmisto-, sulautettu järjestelmä-, verkko-, ja peliohjelmista, esim. Microsoftin ja Adobe Systemsin ohjelmat.[9]

Kehitysvaiheet[muokkaa | muokkaa wikitekstiä]

C++:n kehitys alkaa vuodesta 1979 jolloin Bjarne Stroustrup aloitti kehittämisen. Alkuvaiheessa kieli oli oliolaajennus C-kieleen ja tunnettiin nimellä C with Classes.[10]

  • C++98 (ISO/IEC 14882:1998) oli kielen ensimmäinen ISO-standardoitu versio.
  • C++03 sisälsi korjauksen std::vector määrittelyyn, jonka mukaan elementtien käyttämä muistialue on oltava jatkuva (joka takaa yhteensopivuuden perinteisempien taulukoiden kanssa).[11]
  • C++11 lisää tuen mm. säie-kohtaiselle muistille (thread_local avainsana) sekä säikeistykselle yleisesti.[12] Älyosoittimia kuten std::shared_ptr (toteuttaa viitelaskennan) on lisätty standardikirjastoon.
  • C++14 lisää tuen mm. nk. anonyymeille inline-funktioille (lamba-operaattorit).
  • C++20 on suunniteltu seuraavana C++17:sta jälkeen.

ISO-standardit[muokkaa | muokkaa wikitekstiä]

C++ ISO/IEC standardista on julkaistu seuraavat versiot:

  • ISO/IEC 14882:1998 (1998)[4]
  • ISO/IEC 14882:2003 (2003)[13]
  • ISO/IEC 14882:2011 (2011)[5]
  • ISO/IEC 14882:2014 (2014)[1]

C++17 odotetaan valmistuvan vuoden 2017 aikana.[6]

Tekniset määrittelyt[muokkaa | muokkaa wikitekstiä]

Virallisten standardien lisäksi ISO-työryhmällä on eräitä teknisiä määrittelyjä, jotka eivät ole vielä varsinaisen standardin tasolla ja jotka ovat vielä muuttuvia.

Esimerkkinä N4514, joka määrittelee transaktiopohjaisen muistin käsittelyn tuen C++-kieleen.[14] Osa ohjelmointikielen kääntäjistä tarjoaa kokeellisen tuen kuten esimerkiksi GCC.[15]

ISO:n julkaisemia määrittelyjä:

  • ISO/IEC TR 18015:2006[16]
  • ISO/IEC TR 19768:2007[17]
  • ISO/IEC TR 29124:2010[18]
  • ISO/IEC TR 24733:2011[19]
  • ISO/IEC TS 18822:2015[20]
  • ISO/IEC TS 19570:2015[21]
  • ISO/IEC TS 19841:2015[22]
  • ISO/IEC TS 19568:2015[23]
  • ISO/IEC TS 19217:2015[24]

Standardidokumenttien saatavuus[muokkaa | muokkaa wikitekstiä]

Virallinen standardi on saatavissa ISO:lta korvausta vastaan, mutta viimeisin työskentelyluonnos on saatavilla internetistä ilmaiseksi. Virallisessa standardissa on korjattu kirjoitusvirheitä ja lisätty selvennyksiä.

Erot C:hen[muokkaa | muokkaa wikitekstiä]

Monet C:llä kirjoitetuista ohjelmista ovat myös kelvollista C++:aa. Eivät kuitenkaan kaikki, muun muassa C:n kehittymisen aikana luotujen uusien varattujen sanojen ja tarkemman tyyppitarkistuksen vuoksi.

C:stä poiketen C++ tukee useaa nimiavaruutta.

Standardikirjastot[muokkaa | muokkaa wikitekstiä]

C++ sisältää Standard Template Library (STL) standardikirjaston.

Standard Template Library sisältää yleisiä ohjelmoijien tarvitsemia säiliöitä (containers), algoritmeja ja funktioita.

STL toteutus seuraa usein kääntäjän mukana, mutta myös riippumattomia toteutuksia on olemassa.

Seuraavassa listaa eräistä usein käytetyistä

  • säiliötyyppejä
    • list
    • map
    • set
    • vector
  • merkkijonot (merkkijonosäiliöitä ja käsittelytoimintoja)
    • string
    • wstring
  • algoritmit
    • sort
    • merge
    • min
    • max
  • functor (funktoiden ja metodien ylikirjoittamiseen)

Polymorfismi[muokkaa | muokkaa wikitekstiä]

C++ tukee yksinkertaista perintää, abstrakteja pure virtual luokkia, moniperintää sekä virtuaalista moniperintää.[25][26][27]

Hello, World! -esimerkkiohjelma[muokkaa | muokkaa wikitekstiä]

#include <iostream>

int main() {
    std::cout << "Hello, world!\n";
}

Tämä on yleisesti käytetty esimerkkiohjelma C++-oppaissa. Se tulostaa näytölle tekstin ”Hello, world!” Kuten C:ssä, ohjelma alkaa komennoilla esikääntäjälle, tässä kirjaston liittämisellä #include-käskyllä. Lohkot rajataan aaltosuluilla {}, ja main-funktio suoritetaan aina ensimmäisenä. Ohjaamalla tekstin cout-olioon <<-operaattorilla teksti tulostuu stdout-virtaan (näytölle).

C++:n kielioppi on samantapaista kuin C:n ja Javan. Lauseet päättyvät puolipisteeseen ;, eikä välilyöntejä tai muuta tyhjää tilaa oteta huomioon. Lohkot ympäröidään aaltosulkeilla { }, kommentit aloitetaan /* -merkinnällä ja päätetään */ -merkinnällä. Yhden rivin kommentti merkitään kahdella vinoviivalla //. Kaikki standardikirjaston luokat, funktiot ja globaalit muuttujat ovat std-nimiavaruudessa (namespace).

RTTI[muokkaa | muokkaa wikitekstiä]

Ajonaikainen tyyppitieto (engl. Run-time type information, RTTI) on ominaisuus, jolla välitetyn olion tyyppi voidaan tunnistaa ohjelman ajonaikana.

Tämä mahdollistaa mm. perityn olion tyypin mukaisen käsittelyn.

class Asiakas
{
public:
    virtual ~Asiakas() {}
}

class KantaAsiakas : public Asiakas { ... };

void tyyppi(Asiakas *p)
{
     std::cout << typeid(*p).name() << std::endl;

     KantaAsiakas *k = dynamic_cast<KantaAsiakas*>(p);
     if (k != nullptr)
         k->bonus();
}

Poikkeuskäsittely[muokkaa | muokkaa wikitekstiä]

C++ tukee poikkeuksia ja pinon (stack) siivoamista (kuten näkyvyydeltä eli scopesta poistuessa).

try
{
     throw "vikatilanne"; // const char *
}
catch (std::exception &e)
{
    std::cout << "poikkeus: " << e.what() << std::endl;
}
catch (...)
{
    std::cout << "tuntematon poikkeus" << std::endl;
}

Poikkeuskäsittelijä valitaan määrittelyjärjestyksessä ja tyypin mukaan.

Ellipsis (kolme pistettä) voi vastaanottaa tyypit, joille ei ole muuta käsittelijää.

RAII[muokkaa | muokkaa wikitekstiä]

Konseptia, jossa resurssit varataan konstruktorissa ja vapautetaan destruktorissa kutsutaan nimellä engl. Resource acquisition is initialization, RAII. Konseptin ovat kehittäneet Bjarne Stroustrup ja Andrew Koenig vuosina 1984–89 ja se on esitelty ensimmäisenä C++ kielessä.[28]

RAII-muistihallintakonsepti voidaan esittää seuraavan triviaalin esimerkin avulla:[29]

class Vector 
{
private:
    double *elem; 
    int sz;
public:
    Vector(int s) : elem{new double[s]}, sz{s} // constructor
    {
        for (int i = 0; i != s; ++1) elem[i] = 0;
    }
    ~Vector() { delete [] elem; } // destructor

    double& operator[](int i);
    int size() const { return sz; }
};

void fct(int n) 
{
    Vector v(n); // acquire and initialize
    // .. use v ..
    {
       Vector v2(n*2); // acquire and initialize
       // .. use v2 ..
    } // v2 destroyed
    // .. use v ..
} // v destroyed

Esimerkissä resurssit vapautetaan kutsumalla olion destruktoria:

  1. poikkeustapauksessa
  2. normaalisti poistuessa (näkyvyysalueen scope ulkopuolella)

Olion luominen tekee tarvittavan varauksen ja alustuksen, jotka olion destruktori vapauttaa. Menetelmä on poikkeusturvallinen ja ei tarvitse roskienkeräystä tueksi.

Template-mallit[muokkaa | muokkaa wikitekstiä]

Template-mallit mahdollistavat geneerisen ohjelmoinnin, jossa samoja algoritmeja voidaan käyttää uusille tietotyypeille ilman uutta ohjelmointia.

RAII-esimerkin ohjelmakoodi voidaan muokata geneerisemmäksi käyttämällä template-määrittelyä.

template<typename T> class Vector 
{
private:
    T *elem; 
    int sz;
public:
    Vector(int s) : elem{new T[s]}, sz{s} // constructor
    {
        for (int i = 0; i != s; ++1) elem[i] = 0;
    }
    ~Vector() { delete [] elem; } // destructor

    T& operator[] (int i) { return elem[i]; }
    int size() const { return sz; }
};

void fct(int n) 
{
    Vector<double> v(n); // acquire and initialize
    // .. use v ..
    Vector<int> v2(n)
    // .. use v2 ..

} // v2 and v destroyed

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

  • Stroustrup, Bjarne: The design and evolution of C++. Addison-Wesley, 1994. ISBN 0-201-54330-3.
  • Lippman, Stanley B.: C++ Primer, s. 1–464. Addison-Wesley, 1989. ISBN 0-201-16487-6.
  • Reisdorph, Kent: Teach Yourself C++ in 5 Days, s. 1–192. SAMS, 1999.
  • Hietanen, Päivi: C++ ja olio-ohjelmointi, s. 16. Jyväskylä: Teknolit, 1997. ISBN 952-9823-45-2.
  • Peltonen, Hannu: Olio-ohjelmoinnin perusteet C++, s. 1–389. Jyväskylä: Suomen ATK-kustannus, 1997. ISBN 951-762-457-3.
  • Prata, Stephen: Suuri C++ -ohjelmointi, s. 1–866. Suom. Risto Torkkeli. Vantaa: Pagina, 1996. ISBN 951-644-064-9.
  • Horton, Ivor: C++ Ohjelmoijan käsikirja, s. 1–941. Suom. Jouni Laaksonen. Helsinki: IT Press, 1999. ISBN 951-826-032-X.
  • Lippman, Stanley B. & Lajoie, Josee: C++ Vol 1, s. 1–941. Suom. Erkki Huru. Helsinki: EDITA, 2000. ISBN 951-826-191-1.
  • Meyers, Skott: C++ Vol 2, s. 1–256. Suom. Arto Kuvaja. Helsinki: EDITA, 2000. ISBN 951-826-192-X.
  • Stroustrup, Bjarne: The C++ Programming Language, 4th ed.. Addison-Wesley, 2015. ISBN 0-321-56384-0.

Viitteet[muokkaa | muokkaa wikitekstiä]

  1. a b c ISO/IEC 14882:2014 ISO. Viitattu 25.1.2017.
  2. Stroustrup 1994, s. 63–108
  3. Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991-2006 Viitattu 1.2.2017.
  4. a b ISO/IEC 14882:1998 ISO. Viitattu 25.1.2017.
  5. a b ISO/IEC 14882:2011 ISO. Viitattu 25.1.2017.
  6. a b Recent milestones: C++17 feature-complete, second round of TSes now under development Viitattu 25.1.2017.
  7. Hietanen 1997, s. 16
  8. Bjarne Stroustrup: Bjarne Stroustrup's C++ Style and Technique FAQ Viitattu 26.1.2017.
  9. http://www2.research.att.com/~bs/applications.html
  10. History of C++ Viitattu 26.1.2017.
  11. C++ Standard Library Defect Report List (Revision R101) Viitattu 29.1.2017.
  12. Programming Languages – C++11 Draft (n3797) §3.7.2 Thread Storage duration [basic.stc.thread]
  13. ISO/IEC 14882:2003 ISO. Viitattu 25.1.2017.
  14. Technical Specification for C++ Extensions for Transactional Memory Viitattu 7.3.2017.
  15. C++ Standards Support in GCC Viitattu 7.3.2017.
  16. ISO/IEC TR 18015:2006 International Organization for Standardization.
  17. ISO/IEC TR 19768:2007 International Organization for Standardization.
  18. ISO/IEC TR 29124:2010 International Organization for Standardization.
  19. ISO/IEC TR 24733:2011 International Organization for Standardization.
  20. ISO/IEC TS 18822:2015 International Organization for Standardization.
  21. ISO/IEC TS 19570:2015 International Organization for Standardization.
  22. ISO/IEC TS 19841:2015 International Organization for Standardization.
  23. ISO/IEC TS 19568:2015 International Organization for Standardization.
  24. ISO/IEC TS 19217:2015 International Organization for Standardization.
  25. Solving the Diamond Problem with Virtual Inheritance Cprogramming.com. Viitattu 8.2.2017.
  26. Inheritance – Multiple and Virtual Inheritance Viitattu 8.2.2017.
  27. Derived classes Viitattu 8.2.2017.
  28. Stroustrup, Bjarne 2015: The C++ Programming Language, 4th ed: kpl13, s. 343–387
  29. Stroustrup, Bjarne 2015: The C++ Programming Language, 4th ed: kpl3, s. 63

Kirjallisuutta[muokkaa | muokkaa wikitekstiä]

  • Stroustrup, Bjarne: The C++ Programming Language, s. 1–328. Addison-Wesley, copyright Bell laboratories, 1986. ISBN 0-201-12078-X.
  • Stroustrup, Bjarne: The C++ Programming Language, s. 1–911. Third Edition, Bjarne Stroustrup The Creator of C++. Addison-Wesley, copyright AT&T, 1997. ISBN 0-20-88954-4.
  • Stroustrup, Bjarne: C++ -ohjelmointi, s. 1–944. Alkuteos The C++ Programming Language, Third Edition, Bjarne Stroustrup The Creator of C++. Suom. Veli-Pekka Ketola. Jyväskylä: Teknolit, copyright AT&T, copyright Teknolit, 2000. ISBN 951-846-026-4.

Aiheesta muualla[muokkaa | muokkaa wikitekstiä]

Tämä tietotekniikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.


Käännös suomeksi
Tämä artikkeli tai sen osa on käännetty tai siihen on haettu tietoja muunkielisen Wikipedian artikkelista.
Alkuperäinen artikkeli: en:Resource acquisition is initialization