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 autobuvo 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ų autobuvo š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.secondpaž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 parametraiautokuris buvo pridėtas C ++ 14. Prieš tai negalėjome naudoti autofunkcijų 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]Fiksuoti thisžymeklį pagal vertę.
  • [a, &b]- užfiksuoti objektus apagal vertę, bpagal 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 factor5 eilutėje. Nes paprasčiausiai neturite teisės to daryti. Nepiktnaudžiaukite savo teisėmis! ?

Galiausiai atkreipkite dėmesį, kad mes tai laikome valnuoroda. 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/switchbloke. 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 constreikšmė. Tai yra vienas iš svarbių deklaruotų funkcijų taškų constexpr- pateikti argumentai taip pat turėtų būti constexprarba 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-ifirconstexpr-lambdabuvo pristatyti.

Tuples

Panašiai kaip pair, tupleyra fiksuoto dydžio reikšmių įvairių duomenų tipų kolekcija.

Kartais patogiau naudoti std::arrayvietoj tuple. arrayyra 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!