Kai kurios nuostabios šiuolaikinės C ++ funkcijos, kurias turėtų žinoti kiekvienas kūrėjas
Kaip kalba, C ++ labai išsivystė.
Žinoma, tai neįvyko per naktį. Buvo laikas, kai C ++ trūko dinamikos. Buvo sunku pamilti kalbą.
Tačiau viskas pasikeitė, kai C ++ standartinis komitetas nusprendė pasukti vairą.
Nuo 2011 m. C ++ tapo dinamiška ir nuolat besikeičiančia kalba, kurios tikėjosi daugybė žmonių.
Nesusimąstykite, kad kalba tapo lengvesnė. Tai vis dar yra viena iš sunkiausių programavimo kalbų, jei ne pati sunkiausia, plačiai naudojama. Tačiau „C ++“ tapo daug patogesnė vartotojui nei ankstesnės versijos.
Paskutiniame savo pranešime kalbėjau apie C ++ algoritmų biblioteką, kuri buvo praturtinta per pastaruosius porą metų.
Šiandien mes panagrinėsime keletą naujų funkcijų (pradedant nuo C ++ 11, kuriai, beje, jau yra 8 metai), kurias norėtų žinoti kiekvienas kūrėjas.
Taip pat atkreipkite dėmesį, kad praleidau kai kurias išplėstines šio straipsnio funkcijas, tačiau noriu apie jas rašyti ateityje. ? ️
Eik!
Automatinis raktinis žodis
Pirmą kartą įvedus C ++ 11 auto
, gyvenimas tapo lengvesnis.
Idėja auto
buvo priversti C ++ kompiliatorių išvesti jūsų duomenų tipą, o ne priversti deklaruoti tipą kiekvieną kartą. Tai buvo taip patogu, kai turite duomenų tipus, pvz., Nt, int >>>?map

Pažvelkite į eilutės numerį 5. Negalite kažko deklaruoti be initializer
. Tai iš tikrųjų yra prasminga. 5 eilutė neleidžia kompiliatoriui žinoti, koks gali būti duomenų tipas.
Iš pradžių auto
buvo šiek tiek ribotas. Tada vėlesnėse kalbos versijose jai buvo pridėta daugiau galios!

7 ir 8 eilutėse naudojau skliausteliuose inicializavimą. Tai taip pat buvo nauja funkcija, pridėta C ++ 11.
Atminkite, kad jei naudojate auto
, kompiliatorius turi kokiu nors būdu išvesti jūsų tipą.
Dabar labai gražus klausimas, kas nutiks, jei parašysimeauto a = {1, 2, 3}
? Ar tai kompiliavimo klaida? Ar tai vektorius?

Tiesą sakant, C ++ 11 pristatė pe>. Sutvarkytas inicializuotas sąrašas bus laikomas šiuo lengvu konteineriu, jei bus automatiškai sumažinta .std::initializer_list
lare
Galiausiai, kaip jau minėjau, kompiliatoriaus tipo išskaičiavimas gali būti labai naudingas, kai turite sudėtingas duomenų struktūras:

Nepamirškite patikrinti 25 eilutės! Išraiška auto [v1,v2] = itr.second
pažodžiui yra nauja C ++ 17 funkcija. Tai vadinama struktūriniu įrišimu . Ankstesnėse kalbos versijose kiekvieną kintamąjį turėjote išskirti atskirai. Tačiau struktūrinis įrišimas padarė jį daug patogesnį.
Be to, jei norėtumėte gauti duomenis naudodamiesi nuoroda, tiesiog pridėtumėte simbolį - auto &[v1,v2] = itr.second
.
Tvarkingas.
Lambda išraiška
C ++ 11 pristatė „lambda“ išraiškas, panašias į anonimines „JavaScript“ funkcijas. Jie yra funkciniai objektai, neturintys jokių pavadinimų, ir jie fiksuoja kintamuosius įvairiomis sritimis, remdamiesi tam tikra glausta sintakse. Jie taip pat gali būti priskirti kintamiesiems.
Lambdos yra labai naudingos, jei jums reikia šiek tiek greito dalyko, kurį reikia atlikti kodo viduje, tačiau nenorite tam parašyti visos atskiros funkcijos. Kitas gana įprastas naudojimas yra jų naudojimas kaip funkcijų palyginimas.

Aukščiau pateiktas pavyzdys turi daug ką pasakyti.
Pirma, atkreipkite dėmesį, kaip garbanotas sutvirtintas inicijavimas pakelia jūsų svorį. Tada ateina bendrinis, begin(), end()
kuris taip pat yra papildymas C ++ 11. Tada ateina „lambda“ funkcija kaip duomenų palyginimo priemonė. Deklaruojami lambda funkcijos parametraiauto
kuris buvo pridėtas C ++ 14. Prieš tai negalėjome naudoti auto
funkcijų parametrams.
Atkreipkite dėmesį, kaip mes pradedame lambda išraišką laužtiniu skliaustu []
. Jie apibrėžia lambda taikymo sritį - kiek ji turi vietos kintamųjų ir objektų valdžią.
Kaip apibrėžta šioje nuostabioje šiuolaikinio C ++ saugykloje:
[]
- nieko neužfiksuoja. Taigi savo lambda išraiškoje negalite naudoti jokio išorinės apimties vietinio kintamojo. Galite naudoti tik parametrus.[=]
- fiksuoja vietinius objektus (vietinius kintamuosius, parametrus) pagal apimtį. Galite juos naudoti, bet negalite jų modifikuoti.[&]
- užfiksuoti vietinius objektus (vietinius kintamuosius, parametrus) pagal taikymo sritį. Galite juos modifikuoti. Kaip šis pavyzdys.[this]
Fiksuotithis
žymeklį pagal vertę.[a, &b]
- užfiksuoti objektusa
pagal vertę,b
pagal nuorodą.
Taigi, jei naudodamiesi „lambda“ funkcija norite pakeisti savo duomenis į kokį nors kitą formatą, galite naudoti „lambda“ pasinaudodami pranašumais. Pavyzdžiui:

Ankstesniame pavyzdyje, jei [factor]
savo lambda išraiškoje būtumėte užfiksavę vietinius kintamuosius pagal reikšmę ( ), negalėtumėte pakeisti factor
5 eilutėje. Nes paprasčiausiai neturite teisės to daryti. Nepiktnaudžiaukite savo teisėmis! ?
Galiausiai atkreipkite dėmesį, kad mes tai laikome val
nuoroda. Tai užtikrina, kad bet koks lambda funkcijos pokytis iš tikrųjų pakeis vector
.

Pradėti sakinius viduje, jei & pereiti
Man labai patiko ši „C ++ 17“ funkcija iškart po to, kai su ja susipažinau.

Taigi, matyt, dabar jūs galite atlikti kintamųjų inicijavimą ir patikrinti jo sąlygas - tuo pačiu metu if/switch
bloke. Tai tikrai naudinga norint išlaikyti kodą glaustą ir švarų. Bendra forma yra:
if( init-statement(x); condition(x)) { // do some stuff here } else { // else has the scope of x // do some other stuff }
Atlikite tai kompiliavimo metu
constexpr
yra vėsu!
Tarkime, kad turite kokią nors išraišką, kurią norite įvertinti, ir jos vertė nepakis, kai bus inicijuota. Galite iš anksto apskaičiuoti vertę ir tada ją naudoti kaip makrokomandą. Arba, kaip siūloma C ++ 11, galite naudoti constexpr
.
Programuotojai linkę kiek įmanoma sumažinti savo programų vykdymo laiką. Taigi, jei yra keletas operacijų, galite priversti kompiliatorių atlikti ir pašalinti apkrovą vykdymo metu, tada vykdymo laiką galima pagerinti.

Aukščiau pateiktas kodas yra labai dažnas pavyzdys constexpr
.
Kadangi mes paskelbėme fibonacci skaičiavimo funkciją kaip constexpr
, kompiliatorius gali iš anksto apskaičiuotifib(20)
per kompiliavimo laiką. Taigi po kompiliacijos jis gali pakeisti eilutę
const long long bigval = fib(20);
su
const long long bigval = 2432902008176640000;
Atkreipkite dėmesį, kad pateiktas argumentas yra const
reikšmė. Tai yra vienas iš svarbių deklaruotų funkcijų taškų constexpr
- pateikti argumentai taip pat turėtų būti constexpr
arba const
. Priešingu atveju funkcija veiks kaip įprasta funkcija, o tai reiškia, kad kompiliavimo metu nereikia atlikti išankstinio skaičiavimo.
Kintamieji taip pat gali būti constexpr
. Tokiu atveju, kaip jūs galite atspėti, tuos kintamuosius reikia įvertinti per kompiliavimo laiką. Priešingu atveju gausite kompiliavimo klaidą.
Įdomu tai, kad vėliau C ++ 17 constexpr-if
irconstexpr-lambda
buvo pristatyti.
Tuples
Panašiai kaip pair
, tuple
yra fiksuoto dydžio reikšmių įvairių duomenų tipų kolekcija.

Kartais patogiau naudoti std::array
vietoj tuple
. array
yra panašus į paprasto C tipo masyvą kartu su pora C ++ standartinės bibliotekos funkcijų. Ši duomenų struktūra buvo pridėta C ++ 11.
Klasės šablono argumentų išskaičiavimas
Labai žodinis funkcijos pavadinimas. Idėja yra ta, kad iš C ++ 17 argumentų išskaičiavimas šablonams taip pat įvyks standartiniams klasės šablonams. Anksčiau jis buvo palaikomas tik funkcijų šablonams.
Kaip rezultatas,
std::pair user = {"M", 25}; // previous std::pair user = {"M", 25}; // C++17
Atskaitymo tipas atliekamas netiesiogiai. Tai tampa dar patogiau tuple
.
// previous std::tuple user ("M", "Chy", 25); // deduction in action! std::tuple user2("M", "Chy", 25);
Ši aukščiau pateikta funkcija nebus prasminga, jei nesate gerai susipažinę su C ++ šablonais.
Protingi rodyklės
Rodyklės gali būti pragariškos.
Dėl laisvės, kurią tokios kalbos kaip C ++ suteikia programuotojams, kartais tampa labai lengva šaudyti sau į koją. Daugeliu atvejų rodikliai yra atsakingi už žalą.
Laimei, C ++ 11 pristatė išmaniuosius rodykles, žymeles, kurios yra daug patogesnės nei neapdorotos. Jie padeda programuotojams išvengti atminties nutekėjimo, kai tik įmanoma ją atlaisvindami. Jie taip pat užtikrina išimtinį saugumą.
Sugalvojau šiame įraše parašyti apie išmaniuosius rodiklius C ++. Bet, matyt, yra daug svarbių detalių apie juos. Jie nusipelno savo įrašo, ir aš tikrai noriu apie juos parašyti artimiausiu metu.
Tai viskas siandienai. Atminkite, kad C ++ iš tikrųjų pridėjo daug daugiau naujų funkcijų naujausiose kalbos versijose. Turėtumėte juos patikrinti, jei jaučiate susidomėjimą. Čia yra nuostabi šiuolaikinio C ++ saugykla, kuri pažodžiui pavadinta „Awesome Modern C ++“!
Adios!