C++11
C++11, (ent. C++0x), on ISO:n 12.8.2011 hyväksymä C++-ohjelmointikielen standardi ISO/IEC 14882:2011.[1] 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++.[2]
Muutokset edellisestä standardista
[muokkaa | muokkaa wikitekstiä]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
[muokkaa | muokkaa wikitekstiä]Kieleen on lisätty tyyppiturvallinen nullptr
määrittely.[3][4]
Vanha NULL
-makro usein käsitellään int
-tyyppinä eikä osoittimena. Vanhempi tapa voi hämmentää ajonaikaista tyyppimekanismia kutsumaan väärää metodia.[4]
Käyttöesimerkki:
int a = 0;
int *p = nullptr;
p = &a;
(*p) = 42;
Vakiolauseke
[muokkaa | muokkaa wikitekstiä]Vakiolauseke (constexpr
) määrittää, että lauseke on mahdollista arvioida käännösaikana.[5]
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
[muokkaa | muokkaa wikitekstiä]Olioiden alustamista on yhdenmukaistettu muutoksilla määrittelyyn.[6]
Esimerkiksi kolmen alkion vektorin alustaminen arvoilla:
std::vector<float> v = {0.1, 0.2, 1.0};
Anonyyminen vektorin alustaminen ja välittäminen funktiolle:
myfunction( std::vector<float>{0.1, 0.2, 1.0} );
Lambda-lausekkeet
[muokkaa | muokkaa wikitekstiä]Lambda-lausekkeet ovat paikallisia nimettömiä funktioita, joita voidaan määrittää funktion tai lausekkeen sisällä.[7]
Rajatun alueen toistorakenne
[muokkaa | muokkaa wikitekstiä]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:[8]
std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (auto i : v)
{
std::cout << i << std::endl;
}
Delegoiva konstruktori
[muokkaa | muokkaa wikitekstiä]Delegoiva konstruktori vähentää ohjelmakoodin toistoa useiden konstruktorien yhteydessä.[9]
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
[muokkaa | muokkaa wikitekstiä]Standardi lisää standardikirjastoon atomisuuden toiminnot.[10][11]
Esimerkki käyttötapauksesta:
std::atomic<long> 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
[muokkaa | muokkaa wikitekstiä]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
.[12]
Synkronointiin on myös aikarajoitettu std::timed_mutex
sekä rekursion salliva std::recursive_mutex
ja näiden yhdistelmä std::recursive_timed_mutex
.[13]
Tuple-tyyppi
[muokkaa | muokkaa wikitekstiä]Tuple on template-pohjainen vaihtoehto C-kielen struct
-tyypille.[14]
typedef std::tuple <int, string, double> tTuple;
tTuple data(42, "heippa", 3.14);
Vastaava tietotyyppi on aiemmin esiintynyt esimerkiksi rinnakkaisohjelmointiin kehitetyssä Alef -kielessä.[15]
Älyosoittimet
[muokkaa | muokkaa wikitekstiä]Standardikirjastoon on lisätty älyosoittimia eri tarkoituksiin:[16]
std::weak_ptr
std::shared_ptr
- viitelaskenta[17]std::unique_ptr
Siirto-operaattorit
[muokkaa | muokkaa wikitekstiä]Tyypillisen copy-delete menettelyn sijaan on mahdollista käyttää tehokkaampaa siirto-operaattoria (engl. move):[18]
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
[muokkaa | muokkaa wikitekstiä]- Technical Report 1 - Muistio C++11-versioon suunnitelluista lisäyksistä
Lähteet
[muokkaa | muokkaa wikitekstiä]- ↑ ISO/IEC 14882:2011 ISO. Viitattu 25.1.2017.
- ↑ Herb Sutter: A new chapter, and thoughts on a pivotal year for C++ herbsutter.com. marraskuu 2024. Viitattu 15.11.2024. (englanniksi)
- ↑ nullptr, the pointer literal en.cppreference.com. Viitattu 6.2.2017.
- ↑ a b A name for the null pointer: nullptr (revision 4) open-std.org. Viitattu 6.2.2017.
- ↑ constexpr specifier en.cppreference.com. Viitattu 6.2.2017.
- ↑ list initialization en.cppreference.com. Viitattu 6.2.2017.
- ↑ Lambda expressions and closures for C++ (PDF) open-std.org. 26.2.2006. Viitattu 14.6.2023. (englanniksi)
- ↑ Range-based for loop en.cppreference.com. Viitattu 6.2.2017.
- ↑ Constructors and member initializer lists en.cppreference.com. Viitattu 6.2.2017.
- ↑ Atomic operations library en.cppreference.com. Viitattu 9.2.2017.
- ↑ C++ Atomic Types and Operations open-std.org. Viitattu 9.2.2017.
- ↑ std::mutex en.cppreference.com. Viitattu 21.2.2017.
- ↑ Thread support library en.cppreference.com. Viitattu 21.2.2017.
- ↑ std::tuple en.cppreference.com. Viitattu 6.2.2017.
- ↑ Winterbottom, Phil: Alef Language Reference Manual doc.cat-v.org. Viitattu 20.2.2017.
- ↑ Kieras, David: Using C++11’s Smart Pointers umich.edu. Viitattu 6.2.2017.
- ↑ std::shared_ptr en.cppreference.com. Viitattu 6.2.2017.
- ↑ Move assignment operator en.cppreference.com. Viitattu 6.2.2017.
Aiheesta muualla
[muokkaa | muokkaa wikitekstiä]- 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/