Ką reiškia „const“ funkcijų deklaracijos pabaigoje?

Galimas dublikatas:
„Const“ reikšmė C ++ metodo deklaracijoje?

Sveiki. Turiu knygą, kurioje jis sako kažką panašaus:

 class Foo { public: int Bar(int random_arg) const { // code } }; 

Taip pat klausimas, kodėl turėčiau / neturėčiau naudoti const prieš deklaruodamas argumentus? Ką jis pakeis?

 int Foo (const int Bar) {  } 

Redaguoti: jei dabar darau:

 Foo v1, v2; 

Ar (const-tagged) juostos funkcija yra 3 kartus arba 1 kartą atmintyje?

435
29 июня '10 в 16:31 2010-06-29 16:31 nustatė aPoC birželio 29 d. , 10:31, 2010-06-29 16:31
@ 6 atsakymai

„Const“ funkcija, pažymėta const raktiniu žodžiu po funkcijų deklaracijos, šią klasės klaidą paverčia kompiliatoriaus funkcija, kad pakeistų klasės nario kintamąjį. Tačiau skaitymo klasės kintamieji yra normalūs funkcijos viduje, bet rašymas šios funkcijos viduje sukels kompiliatoriaus klaidą.

Kitas būdas pagalvoti apie tokią „pastovią funkciją“ yra laikyti klasių funkciją kaip įprastą funkciją, kuri užima netiesioginį rodiklį. Taigi, int Foo::Bar(int random_arg) metodas int Foo::Bar(int random_arg) (be const pabaigoje) sukelia funkciją, pvz., int Foo_Bar(Foo* this, int random_arg) ir skambutį, pavyzdžiui, Foo f; f.Bar(4) Foo f; f.Bar(4) Foo f; f.Bar(4) Foo f; f.Bar(4) viduje Foo f; f.Bar(4) kažką panašaus į Foo f; Foo_Bar( 4) Foo f; Foo_Bar( 4) Foo f; Foo_Bar( 4) Foo f; Foo_Bar( 4) . Tada „const“ pridėjimas pabaigoje ( int Foo::Bar(int random_arg) const ) gali būti suprantamas kaip deklaratorius su rodykle const this: int Foo_Bar(const Foo* this, int random_arg) . Kadangi šio tipo tipas šiuo atveju yra const, nario kintamųjų modifikacija neįmanoma.

Galite atsipalaiduoti apribojimo „const“ funkcijai, uždraudžiant funkciją rašyti bet kokį klasės kintamąjį. Tam, kad kai kurie kintamieji būtų rašomi, net jei funkcija pažymėta kaip „pastovi funkcija“, šie klasės kintamieji yra pažymėti kintamuoju raktiniu žodžiu. Taigi, jei klasės kintamasis yra pažymėtas kaip keičiamas, ir "pastovi funkcija" rašo į šį kintamąjį, tada kodas bus tinkamai sukompiliuotas ir kintamasis gali būti pakeistas. (C ++ 11)

Kaip įprasta su raktinio žodžio const raktinio žodžio vietos keitimas C ++ išraiška turi visiškai skirtingas reikšmes. Pirmiau minėtas „ const taikomas tik tada, kai po skliaustelių pridedamas į funkcijų deklaracijos pabaigą const .

const yra perdėtas prefiksas C ++: sintaksė ir tvarka dažnai nėra taip paprasta kartu su rodyklėmis. Kai kurios const apie „ const teisingumą ir raktinį žodį:

Konstansas

„C ++“ nuolatinė deklaracija: kodėl ir kaip

749
29 июня '10 в 16:32 2010-06-29 16:32 atsakymą pateikė Janickas Bernetas birželio 29 d. 10 val. 16:32 2010-06-29 16:32

Apsvarstykite du tipo kintamuosius:

 class Boo { ... }; Boo b0; // mutable object const Boo b1; // non-mutable object 

Dabar galite paskambinti bet kuriam Boo funkcijų nariui b0 , bet tik const kvalifikuotas nario funkcijas b1 .

35
29 июня '10 в 16:36 2010-06-29 16:36 Atsakymą pateikė Nikolajus Fetissovas birželio 10 d. 10 val. 16:36 PM 2010-06-29 16:36

Bar garantuoja, kad nekeičia objekto, kuriuo jis vadinamas. Pavyzdžiui, skyriuje apie nuolatinį teisingumą C ++ DUK.

11
29 июня '10 в 16:34 2010-06-29 16:34 Atsakymą mkluwe teikia birželio 29 d. 10 val. 16:34 2010-06-29 16:34

Atrodo, šis klausimas.

Iš esmės tai reiškia, kad Bar metodas nepakeis kintamųjų kintamųjų - „ Foo narys.

8
29 июня '10 в 16:33 2010-06-29 16:33 atsakymą pateikė JLWarlow birželio 29 d. 10 val. 16:33 2010-06-29 16:33

Funkcija negali pakeisti savo parametrų naudodama rodomą nuorodą.

Aš kiekvieną kartą kreipiuosi į šį puslapį:

http://www.parashift.com/c++-faq-lite/const-correctness.html

Manau, kad taip pat yra geras skyrius „Meyers“, „Efektyvesnis C + +“.

7
29 июня '10 в 18:09 2010-06-29 18:09 atsakymą pateikė orbfish , birželio 29 d., 10 val. 18:09 2010-06-29 18:09

Man visada atrodo, kad konceptualiai lengviau manyti, kad jūs sukuriate šį const rodiklį (kuris iš esmės yra tai, ką jis daro).

7
29 июня '10 в 16:35 2010-06-29 16:35 atsakymą pateikė „ Goz “ birželio 29 d. 10 val. 16:35 2010-06-29 16:35

Kiti klausimai dėl žymių arba Užduoti klausimą