C++11

C++11, (ent. C++0x), on ISO:n 12.8.2011 hyväksymä C++-ohjelmointikielen standardi ISO/IEC 14882:2011. Standardi korvasi aiemmat ISO/IEC 14882:1998 (C++98) ja ISO/IEC 14882:2003 (C++03) standardiversiot. Nimessä esiintyvä 11 tulee yleisen nimeämiskäytännön mukaisesti standardin julkaisuvuodesta. C++0x-tunnusta käytettiin työskentelyvaiheessa, koska valmistumisvuodesta ei ollut varmuutta, mutta sen uskottiin valmistuvan ennen vuotta 2010. Standardin on korvannut C++14 standardi ISO/IEC 14882:2014, joka hyväksyttiin 18. elokuuta 2014. C++11 lisäsi itse kieleen useita ominaisuuksia sekä laajentaa C++:n standardikirjastoa STL:a. Standardikirjaston laajennos käsittää suurimman osan aikaisemmasta C++ Technical Report 1:stä (TR1). C++11:sta on sanottu käännekohtana, jonka jälkeen käytössä on ollut "uusi" moderni C++. ==Muutokset edellisestä standardista== Uusi standardi laajentaa varsinaista kieltä sekä sen standardikirjastoa. Pääsuuntaviivat uutta versiota suunniteltaessa olivat: * Säilyttää stabiilius sekä yhteensopivuus C++98:n ja mahdollisuuksien mukaan C:n kanssa; * Mahdollisuuksien mukaan lisätä uudet ominaisuudet standardikirjastoon itse kieleen lisäämisen sijasta; * Tehdä muutoksia, jotka ohjaavat käyttäjää oikeaan toteutustekniikkaan ja -tyyliin; * Tukea systeemien ja kirjastojen suunnittelua pelkän uusien ominaisuuksien esittelyn sijaan; * Parantaa tyypityksen turvallisuutta tarjoamalla aiemmin turvattomille tekniikoille vaihtoehtoja; * Parantaa suorituskykyä ja laitteistorajapinnan kanssa kommunikointia; * Tarjota oikeita ratkaisuja reaalimaailman ongelmiin; * Toteuttaa niin sanottua "zero- overhead"-periaatetta; * Tehdä C++:sta helposti opiskeltava kieli ottamatta kuitenkaan pois ominaisuuksia, joita kokeneemmat ohjelmoijat tarvitsevat; Aloittelijoiden huomioon ottaminen koettiin tärkeäksi, koska ohjelmoijista suurin osa tulee aina olemaan aloittelijoita, ja koska suurin osa heistä tuskin koskaan tulee perehtymään C++:aan syvällisemmin. == Tyyppiturvallinen nolla-osoitin == Kieleen on lisätty tyyppiturvallinen `nullptr` määrittely. Vanha `NULL` -makro usein käsitellään `int`-tyyppinä eikä osoittimena. Vanhempi tapa voi hämmentää ajonaikaista tyyppimekanismia kutsumaan väärää metodia. Käyttöesimerkki: int a = 0; int *p = nullptr; p = &a; (*p) = 42; == Vakiolauseke == Vakiolauseke (`constexpr`) määrittää, että lauseke on mahdollista arvioida käännösaikana. Esimerkki: const double pi = 3.14; constexpr double pi_mul(int n) { return n * pi; } Käyttö olettaa että parametrina annettavat arvot ovat käännösaikana tunnettuja literaaleja. C++14 laajentaa vakiolausekkeen määrittelyä. == Yhdenmukaistettu alustaminen == Olioiden alustamista on yhdenmukaistettu muutoksilla määrittelyyn. Esimerkiksi kolmen alkion vektorin alustaminen arvoilla: std::vector v = {0.1, 0.2, 1.0}; Anonyyminen vektorin alustaminen ja välittäminen funktiolle: myfunction( std::vector{0.1, 0.2, 1.0} ); == Lambda-lausekkeet == Lambda-lausekkeet ovat paikallisia nimettömiä funktioita, joita voidaan määrittää funktion tai lausekkeen sisällä. == Rajatun alueen toistorakenne == Perinteisten C-kielen toistorakenteiden vaihtoehdoksi on lisätty automatisoitu vaihtoehto. Uudempi menetelmä vähentää tyypillisen koodin toistuvaa kirjoittamista. Tietorakenteissa olevien arvojen käsittelyä voidaan yksinkertaistaa seuraavasti: std::vector v = {0, 1, 2, 3, 4, 5}; for (auto i : v) { std::cout << i << std::endl; } == Delegoiva konstruktori == Delegoiva konstruktori vähentää ohjelmakoodin toistoa useiden konstruktorien yhteydessä. class Testi { private: std::string m_s; int m_i; public: Testi(std::string s, int i) : m_s(s), m_i(i) {} Testi(int i) : Testi("testi", i) {} }; == Atomiset operaatiot == Standardi lisää standardikirjastoon atomisuuden toiminnot. Esimerkki käyttötapauksesta: std::atomic almuuttuja; almuuttuja = 0; // asettaa arvoon 0 // lisää muuttujaan arvon 42 ja palauttaa uuden arvon long uusiarvo = almuuttuja.fetch_add(42); Ohjelmointikielen käyttämä tekninen toteutustapa voi riippua käytetystä suorittimesta. == Säikeistyksen tuki == Monisäikeistykselle on lisätty alustariippumatonta tukea määrittelyyn. Näin ollen ohjelmakoodin siirtäminen helpottuu vähemmillä muutoksilla. Standardikirjastossa on `std::thread` säikeiden luomiseen ja käsittelyyn. Parametrina tälle annetaan funktio-objekti (osoite säikeen suorituksen alkupaikkaan). Lisäksi `thread_local` avainsanalla voi määritellä säiekohtaisia muuttujia. Synkronointitukea on atomisien operaatioiden lisäksi käytettävissä luokilla `std::mutex` ja `std::lock_guard`. Synkronointiin on myös aikarajoitettu `std::timed_mutex` sekä rekursion salliva `std::recursive_mutex` ja näiden yhdistelmä `std::recursive_timed_mutex`. == Tuple-tyyppi == Tuple on template-pohjainen vaihtoehto C-kielen `struct`-tyypille. typedef std::tuple tTuple; tTuple data(42, "heippa", 3.14); Vastaava tietotyyppi on aiemmin esiintynyt esimerkiksi rinnakkaisohjelmointiin kehitetyssä Alef -kielessä. == Älyosoittimet == Standardikirjastoon on lisätty älyosoittimia eri tarkoituksiin: * `std::weak_ptr` * `std::shared_ptr` \- viitelaskenta * `std::unique_ptr` == Siirto-operaattorit == Tyypillisen copy-delete menettelyn sijaan on mahdollista käyttää tehokkaampaa siirto-operaattoria (): class MyContainer { // ... MyContainer & operator=(MyContainer && other) { if (this != &other;) { // ... } return *this; } Menetelmä välttää nk. deep-copy toiminnon, joka voi olla raskas käytössä. == Katso myös == * Technical Report 1 - Muistio C++11-versioon suunnitelluista lisäyksistä == Lähteet == ==Aiheesta muualla== *Viimeinen työskentelyluonnos (working draft) C++11 -standardiin: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf *C++11 vinkkejä http://www.crodesoft.com/2013/01/10/cpp11-vinkkeja/ Luokka: C++ sv:C++#Historia