Ar „const“ reikšmė paskutinės klasės funkcijos deklaracijoje?

Kokia reikšmė yra tokiuose skelbimuose? const mane painioja.

 class foobar { public: operator int () const; const char* foo() const; }; 
620
15 апр. nustatė user91111 balandžio 15 d 2009-04-15 16:27 '09, 16:27, 2009-04-15 16:27
@ 8 atsakymai

Kai prie metodo pridedate „ const raktinį žodį, this žymeklis iš esmės taps rodikliu į const objektą, todėl negalite keisti elemento duomenų. (Jei nenaudojate mutable , daugiau apie tai vėliau.)

const raktinis žodis yra funkcijos parašo dalis, o tai reiškia, kad galite įgyvendinti du panašius metodus: vieną, kuris vadinamas, kai objektas yra const o kitas - ne.

 #include <iostream> class MyClass { private: int counter; public: void Foo() { std::cout << "Foo" << std::endl; } void Foo() const { std::cout << "Foo const" << std::endl; } }; int main() { MyClass cc; const MyClass ccc = cc; cc.Foo(); ccc.Foo(); } 

Tai lems išvadą

 Foo Foo const 

Naudojant non-const metodą, galite pakeisti egzemplioriaus narius, kuriuos negalite atlikti „ const versijoje. Jei pakeisite anksčiau pateiktame pavyzdyje pateiktą metodo deklaraciją į toliau pateiktą kodą, gausite klaidų.

  void Foo() { counter++; //this works std::cout << "Foo" << std::endl; } void Foo() const { counter++; //this will not compile std::cout << "Foo const" << std::endl; } 

Taip nėra, nes galite pažymėti elementą kaip mutable o const metodas gali jį pakeisti. Jis daugiausia naudojamas vidiniams skaitikliams ir pan. Šio sprendimo sprendimas yra toliau pateiktas kodas.

 #include <iostream> class MyClass { private: mutable int counter; public: MyClass() : counter(0) {} void Foo() { counter++; std::cout << "Foo" << std::endl; } void Foo() const { counter++; std::cout << "Foo const" << std::endl; } int GetInvocations() const { return counter; } }; int main(void) { MyClass cc; const MyClass ccc = cc; cc.Foo(); ccc.Foo(); std::cout << "The MyClass instance has been invoked " << ccc.GetInvocations() << " times" << endl; } 

kuri bus išduodama

 Foo Foo const The MyClass instance has been invoked 2 times 
827
15 апр. Mats Fredriksson atsakymas, pateiktas balandžio 15 d 2009-04-15 16:49 '09 at 4:49 PM 2009-04-15 16:49

Suderinimas reiškia, kad pažadų metodas neturėtų keisti jokių klasės narių. Tokiu būdu pažymėtus objektus galite atlikti net jei objektas buvo pažymėtas const :

 const foobar fb; fb.foo(); 

bus teisėtas.

Žr. Kiek ir kokie naudojimo būdai naudoja „const“ C ++ sistemoje? daugiau informacijos.

172
15 апр. Blair Conrad atsakymas, pateiktas balandžio 15 d 2009-04-15 16:29 '09, 16:29, 2009-04-15 16:29

const kvalifikatorius reiškia, kad metodai gali būti vadinami bet kokia foobar verte. Skirtumas kyla, kai manote, kad vadinasi non-const metodas const objektui. Apsvarstykite, ar jūsų foobar tipo papildoma metodo deklaracija buvo tokia:

 class foobar { ... const char* bar(); } 

bar() metodas nėra pastovus ir gali būti pasiekiamas tik iš ne pastovių verčių.

 void func1(const foobar fb1, foobar fb2) { const char* v1 = fb1.bar(); // won't compile const char* v2 = fb2.bar(); // works } 

const “ idėja yra pažymėti metodus, kurie nekeičia klasės vidinės būsenos. Tai yra galinga koncepcija, tačiau C ++ programoje ji nėra įgyvendinta. Tai daugiau pažadas nei garantija. Ir tai, kuri dažnai pertrauka ir lengvai pertrauka.

 foobar fbNonConst = const_cast<foobar> 
41
15 апр. Atsakymą pateikė JaredPar 15 balandis. 2009-04-15 16:30 '09, 4:30 val. 2009-04-15 16:30

Šios konstantos reiškia, kad kompiliatorius bus klaida, jei metodas „su const“ pakeičia vidinius duomenis.

 class A { public: A():member_() { } int hashGetter() const { state_ = 1; return member_; } int goodGetter() const { return member_; } int getter() const { //member_ = 2; // error return member_; } int badGetter() { return member_; } private: mutable int state_; int member_; }; 

Bandymas

 int main() { const A a1; a1.badGetter(); // doesn't work a1.goodGetter(); // works a1.hashGetter(); // works A a2; a2.badGetter(); // works a2.goodGetter(); // works a2.hashGetter(); // works } 

Skaitykite daugiau apie

20
15 апр. Mykola Golubyev atsakymas, pateiktas balandžio 15 d. 2009-04-15 16:30 '09, 4:30 val. 2009-04-15 16:30

Blairo atsakymas yra ant ženklo.

Tačiau atkreipkite dėmesį, kad egzistuoja mutable kvalifikatorius, kurį galima pridėti prie klasės duomenų narių. Bet kuris toks pažymėtas narys gali būti pakeistas const metodu, nepažeidžiant sutarčių sutarties.

Galite tai naudoti (pavyzdžiui), jei norite, kad objektas prisimintų, kiek kartų konkretus metodas yra vadinamas nepaveikiant šio metodo „loginio“ konstanta.

9
15 апр. Alnitako atsakymas, pateiktas balandžio 15 d 2009-04-15 16:37 '09 16:37 2009-04-15 16:37

Nario funkcijos funkcija C ++ bendrojoje žinioje: Pagrindinis tarpinis programavimas suteikia aiškų paaiškinimą:

Šio rodyklės tipas X klasės nekomercinėje funkcijoje yra X * const. Tai reiškia, kad jos pastovus rodyklė į ne pastovią X (žr. Rodykles ir pastovius rodiklius [7, 21]). Kadangi objektas, kuriam tai reiškia, nėra pastovus, jis gali būti pakeistas. Šios klasės tipas X klasės klasėje yra const X * const. Tai reiškia, kad jis yra pastovus rodyklė konstanta X. Kadangi objektas, kuriam jis priklauso, yra const, jis negali būti pakeistas. Tai skirtumas tarp const ir non-const.

Taigi savo kode:

 class foobar { public: operator int () const; const char* foo() const; }; 

Galite galvoti taip:

 class foobar { public: operator int (const foobar * const this) const; const char* foo(const foobar * const this) const; }; 
6
14 марта '17 в 8:48 2017-03-14 08:48 atsakymą pateikė „ Nan Xiao “ kovo 17 d. 17 val. 8:48 2017-03-14 08:48

kai naudojate const metodo paraše (pvz., jūsų pasakyta: const char* foo() const; ), pasakykite kompiliatoriui, kad šiuo būdu pažymėta atmintis negali būti pakeista šiuo metodu (kuris yra čia).

4
30 мая '15 в 8:54 2015-05-30 08:54 atsakymą pateikia „ Matrix Buster“ gegužės 30 d. 15, 8:54 2015-05-30 08:54

Tiesiog pridėkite atsakymą į Mats Fredriksson ...

 class MyClass { static int counter; // mutable (or static) allows const method to change it public: void Foo() {std::cout << "Foo " << counter++ << std::endl;} void Foo() const {std::cout << "Foo const " << counter++ << std::endl;} // const obj calls this }; int MyClass::counter = 0; // static counter needs initializing int main() { MyClass a; const MyClass b = a; a.Foo(); b.Foo(); // calls const version } 
0
21 дек. Atsakymą pateikė Puddle, gruodžio 21 d. 2018-12-21 16:02 '18, 4:02 pm 2018-12-21 16:02

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