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.[1][2]
C++ | |
---|---|
![]() |
|
Paradigma | moniparadigmainen; proseduraalinen, olio-ohjelmointi, geneerinen, funktionaalinen |
Tyypitys | vahva, staattinen |
Yleinen suoritusmalli | käännettävä |
Muistinhallinta | manuaalinen, RAII |
Julkaistu | 1983 |
Kehittäjä | Bjarne Stroustrup |
Vakaa versio | ISO/IEC 14882:2017 |
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 |
Verkkosivu | https://isocpp.org/ |
Uutisryhmä | comp.lang.c++ |
C++-kielen standardi ISO/IEC 14882:1998 vahvistettiin vuonna 1998,[3] C++11 (ent. C++0x) vuonna 2011,[4] C++14 (ISO/IEC 14882:2014) vuonna 2014.[5] Uusin standardi ISO/IEC 14882:2017 (C++17) on valmistunut 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 geneerisen ohjelmoinnin.[8] Kieli ei ole täysin funktionaalisen ohjelmoinnin kieli, mutta mahdollistaa monia vastaavia käyttötapoja.[9][10]
Muistihallinta on suunniteltu RAII (engl. Resource acquisition is initialization) konseptille, joka soveltuu mm. poikkeuksien kanssa käyttöön.[11]
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.[12]
Historia ja vaikutteetMuokkaa
C++:n kehitys alkaa vuodesta 1979 jolloin Bjarne Stroustrup työskenteli tohtorintutkinnon parissa.[13] Tuolloin Stroustrup työskenteli muun muassa Simula-kielellä, jonka sanotaan olevan ensimmäinen olio-ohjelmoinnin paradigmaa tukeva kieli.[13] Stroustrup koki paradigman hyvin käytännölliseksi, mutta kielen liian hitaaksi käytännölliseen soveltamiseen.[13] Tämän jälkeen Stroustrup aloitti C with Classes -laajennuksen kehittämisen C-kieleen.[13] Vuonna 1983 kielen nimi vaihtui C++:ksi.[13]
C++:n luokat ja luokkahierarkia on peräisin Simulasta.[14] Kieli lainasi myös suunnitteluajattelun, jossa luokat mallintavat käsitteitä ohjelmoijan ja sovelluksen maailmassa eivätkä ainoastaan notaationaalisessa merkityksessä.[15]
Kielen suunnittelussa vältettiin ominaisuuksia, jotka aiheuttaisivat ajonaikaista tai muistikuormitusta.[16]
KehitysvaiheetMuokkaa
Kielestä on julkaistu useita kehitysversioita:
- 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).[17]
- C++11 lisää tuen mm. säie-kohtaiselle muistille (thread_local avainsana) sekä säikeistykselle yleisesti.[18] Älyosoittimia kuten
std::shared_ptr
(toteuttaa viitelaskennan) on lisätty standardikirjastoon.
- C++14 lisää tuen mm. nk. anonyymeille inline-funktioille (lamba-operaattorit).
- C++17 on laaja päivitys, jossa on mm. UTF-8 merkkijonoliteraalit, standardoitu tiedostojärjestelmätuki ja standardikirjaston rinnakkaissuorituksen parantaminen.
ISO-standarditMuokkaa
C++ ISO/IEC standardista on julkaistu seuraavat versiot:
- ISO/IEC 14882:1998 (1998)[3]
- ISO/IEC 14882:2003 (2003)[20]
- ISO/IEC 14882:2011 (2011)[4]
- ISO/IEC 14882:2014 (2014)[5]
- ISO/IEC 14882:2017 (2017)[6]
- ISO/IEC CD 14882(tuleva)[21]
Tekniset määrittelytMuokkaa
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.[22] Osa ohjelmointikielen kääntäjistä tarjoaa kokeellisen tuen kuten esimerkiksi GCC.[23]
ISO:n julkaisemia määrittelyjä:
- ISO/IEC TR 18015:2006[24]
- ISO/IEC TR 19768:2007[25]
- ISO/IEC TR 29124:2010[26]
- ISO/IEC TR 24733:2011[27]
- ISO/IEC TS 18822:2015[28]
- ISO/IEC TS 19570:2015[29]
- ISO/IEC TS 19841:2015[30]
- ISO/IEC TS 19568:2015[31]
- ISO/IEC TS 19217:2015[32]
Standardidokumenttien saatavuusMuokkaa
Virallinen standardi on saatavissa ISO:lta korvausta vastaan, mutta viimeisin työskentelyluonnos on saatavilla julkisesti ilmaiseksi.[33] Virallisessa standardissa on korjattu kirjoitusvirheitä ja lisätty selvennyksiä.
Standardidokumentit eivät ole tarkoitettu oppaaksi kielen oppimiseen, vaan ne ovat formaaleja sopimuksia kääntäjien ja standardikirjastojen kehittäjille.[33]
Erot C:henMuokkaa
Monet hyvät C-kielellä kirjoitetuista ohjelmista ovat myös kelvollista C++:aa.[34] 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.[35]
StandardikirjastotMuokkaa
C++ sisältää Standard Template Library (STL) standardikirjaston.
Standard Template Library sisältää yleisiä ohjelmoijien tarvitsemia säiliöitä (containers), algoritmeja, funktioita ja iteraattoreita. STL toteutus seuraa usein kääntäjän mukana, mutta myös riippumattomia toteutuksia on olemassa.
C++:n standardikirjasto sisältää STL:n lisäksi myös joukon C-kielen standardikirjastoa vastaavista toiminnoista yhteensopivuuden vuoksi.[36]
PolymorfismiMuokkaa
C++ tukee yksinkertaista perintää, abstrakteja pure virtual luokkia, moniperintää sekä virtuaalista moniperintää.[37][38][39]
Rajapinnan perimistä kutsutaan ajonaikaiseksi polymorfismiksi (tai dynaamiseksi polymorfismiksi) ja template-mallien tukemaa käännösaikaiseksi polymorfismiksi (tai staattiseksi polymorfismiksi).[40]
C++:ssa funktiot voidaan määritellä:[41]
virtual
, jolloin se voidaan ylikirjoittaa perityssä luokassaoverride
, jolloin sen on pakko ylikirjoittaa kantaluokassa olevafinal
, jolloin sitä ei voida ylikirjoittaa perityssä luokassa
Hello, World! -esimerkkiohjelmaMuokkaa
#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ä otsikkotiedoston liittämisellä #include
-käskyllä. Lohkot rajataan aaltosuluilla {} ja main
-funktio suoritetaan aina ensimmäisenä. Ohjaamalla teksti cout-olioon <<-operaattorilla teksti tulostuu stdout-virtaan (näytölle).
C++:n tulostuslauseen epätavallinen syntaksi johtuu kielen tukemasta operaattorien uudelleenmäärittelystä. C-kielen bitinsiirto-operaattori << on C++:ssa määritelty tulostukseksi stream-olioon.
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 enumeraatiot ovat std
-nimiavaruudessa.
NimiavaruudetMuokkaa
C++ tukee useaa nimiavaruutta.[42]C++17 lisäsi tuen sisäkkäisille nimiavaruuksille, joka mahdollistaa namespace A::B::C {}
käytön aiemman namespace A { namespace B { namespace C {}}}
sijaan.[43]
Lisäksi kieli tukee nimiavaruuden aliasointia:[44]
namespace foo {
namespace bar {
namespace baz {
int qux = 42;
}
}
}
namespace fbz = foo::bar::baz;
int main()
{
std::cout << fbz::qux << '\n';
}
C++ tukee myös anonyymejä nimiavaruuksia.[45]
Aaltosuluilla merkittävät lohkot luovat oman nimiavaruuden kaltaisen näkyvyysalueen (engl. scope):[46]
std::string foo = "foo";
{
std::string foo = "foobar";
} // sisempi foo tuhotaan tässä
std::cout << foo << std::endl; // tulostaa ensimmäisen foo:n arvon
RTTIMuokkaa
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äsittelyMuokkaa
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.[47]
Poikkeuskäsittely try
-lohkolla ja throw
-operaattorilla on valinnaista, jolloin niiden aiheuttama lisäkuorma voidaan välttää.[48]
Ellipsis (kolme pistettä) voi vastaanottaa tyypit, joille ei ole muuta käsittelijää.
RAIIMuokkaa
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ä.[49]
RAII-muistihallintakonsepti voidaan esittää seuraavan triviaalin esimerkin avulla:[50]
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:
- poikkeustapauksessa
- 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-mallitMuokkaa
C++ tukee suoraan geneeristä ohjelmointia template-malleilla, joille voidaan antaa tyyppi parametrina.[51] Templatet 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ösMuokkaa
- Ohjelmointi
- Ohjelmointikieli
- SystemC – C++ -pohjainen laitteistokuvauskieli
LähteetMuokkaa
- 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. Suomentanut Risto Torkkeli. Vantaa: Pagina, 1996. ISBN 951-644-064-9.
- Horton, Ivor: C++ Ohjelmoijan käsikirja, s. 1–941. Suomentanut Jouni Laaksonen. Helsinki: IT Press, 1999. ISBN 951-826-032-X.
- Lippman, Stanley B. & Lajoie, Josee: C++ Vol 1, s. 1–941. Suomentanut Erkki Huru. Helsinki: EDITA, 2000. ISBN 951-826-191-1.
- Meyers, Skott: C++ Vol 2, s. 1–256. Suomentanut 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.
ViitteetMuokkaa
- ↑ Stroustrup 1994, s. 63–108
- ↑ Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991–2006 stroustrup.com. Viitattu 1.2.2017.
- ↑ a b ISO/IEC 14882:1998 ISO. Viitattu 25.1.2017.
- ↑ a b ISO/IEC 14882:2011 ISO. Viitattu 25.1.2017.
- ↑ a b ISO/IEC 14882:2014 ISO. Viitattu 25.1.2017.
- ↑ a b ISO/IEC 14882:2017 ISO. Viitattu 5.12.2017.
- ↑ Hietanen 1997, s. 16
- ↑ Stroustrup 2015, s. 11
- ↑ David Cravey: C++ - Functional-Style Programming in C++ docs.microsoft.com. elokuu 2012. Viitattu 25.2.2020. (englanniksi)
- ↑ John Carmack: In-depth: Functional programming in C++ gamasutra.com. 30.4.2012. Viitattu 25.2.2020. (englanniksi)
- ↑ Bjarne Stroustrup: Bjarne Stroustrup's C++ Style and Technique FAQ stroustrup.com. Viitattu 26.1.2017.
- ↑ http://www2.research.att.com/~bs/applications.html
- ↑ a b c d e History of C++ cplusplus.com. Viitattu 21.2.2020.
- ↑ Stroustrup 2015, s. 577
- ↑ Stroustrup 2015, s. 577
- ↑ Stroustrup 2015, s. 15
- ↑ C++ Standard Library Defect Report List (Revision R101) open-std.org. Viitattu 29.1.2017.
- ↑ Programming Languages – C++11 Draft (n3797) §3.7.2 Thread Storage duration [basic.stc.thread]
- ↑ Bjarne Stroustrup on C++20's significance isocpp.org. 21.2.2020. Viitattu 25.2.2020. (englanniksi)
- ↑ ISO/IEC 14882:2003 ISO. Viitattu 25.1.2017.
- ↑ ISO/IEC CD 14882 ISO. Viitattu 25.2.2020.
- ↑ Technical Specification for C++ Extensions for Transactional Memory open-std.org. Viitattu 7.3.2017.
- ↑ C++ Standards Support in GCC gcc.gnu.org. Viitattu 7.3.2017.
- ↑ ISO/IEC TR 18015:2006 International Organization for Standardization.
- ↑ ISO/IEC TR 19768:2007 International Organization for Standardization.
- ↑ ISO/IEC TR 29124:2010 International Organization for Standardization.
- ↑ ISO/IEC TR 24733:2011 International Organization for Standardization.
- ↑ ISO/IEC TS 18822:2015 International Organization for Standardization.
- ↑ ISO/IEC TS 19570:2015 International Organization for Standardization.
- ↑ ISO/IEC TS 19841:2015 International Organization for Standardization.
- ↑ ISO/IEC TS 19568:2015 International Organization for Standardization.
- ↑ ISO/IEC TS 19217:2015 International Organization for Standardization.
- ↑ a b The Standard isocpp.org. Viitattu 25.2.2020. (englanniksi)
- ↑ Stroustrup 2015, s. 15
- ↑ Namespaces en.cppreference.com. Viitattu 28.7.2018.
- ↑ C++ Standard Library headers en.cppreference.com. Viitattu 5.3.2020. (englanniksi)
- ↑ Solving the Diamond Problem with Virtual Inheritance Cprogramming.com. Viitattu 8.2.2017.
- ↑ Inheritance – Multiple and Virtual Inheritance isocpp.org. Viitattu 8.2.2017.
- ↑ Derived classes en.cppreference.com. Viitattu 8.2.2017.
- ↑ Stroustrup 2015, s. 578
- ↑ Stroustrup 2015, s. 307
- ↑ Namespaces en.cppreference.com. Viitattu 28.7.2018.
- ↑ Nested namespace definition (revision 2) open-std.org. Viitattu 3.3.2017.
- ↑ Namespace aliases en.cppreference.com. Viitattu 28.7.2018.
- ↑ Unnamed namespaces (C++ only) IBM. Viitattu 28.7.2018.
- ↑ Scope en.cppreference.com. Viitattu 28.7.2018.
- ↑ Stroustrup 2015, s. 370
- ↑ Stroustrup 2015, s. 15
- ↑ Stroustrup, Bjarne 2015: The C++ Programming Language, 4th ed: kpl13, s. 343–387
- ↑ Stroustrup, Bjarne 2015: The C++ Programming Language, 4th ed: kpl3, s. 63
- ↑ Stroustrup 2015, s. 665
KirjallisuuttaMuokkaa
- 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++. Suomentanut Veli-Pekka Ketola. Jyväskylä: Teknolit, copyright AT&T, copyright Teknolit, 2000. ISBN 951-846-026-4.
Aiheesta muuallaMuokkaa
- Programming:C plus plus Wikibook, C++-opas (englanniksi)
- Thinking in C++, kattava ilmainen e-kirja C++:sta (englanniksi)
- C++ opas, laaja Suomenkielinen C++ opas.
- C++ Standards Committee Papers (englanniksi)
- C++17 Working Draft (englanniksi)
- C++ Core Guidelines (englanniksi)