kzen.dev
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
 aPoC
aPoC
Question

Čo znamená "const" na konci deklarácie funkcie?

Možné duplikáty: [Význam “const” last v deklarácii metódy C++?] (https://stackoverflow.com/questions/751681/meaning-of-const-last-in-a-c-method-declaration)

Dostala sa mi do rúk kniha, kde je napísané niečo ako:

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

Čo to znamená?

495 2010-06-29T13:31:02+00:00 3
Mark Amery
Mark Amery
Edited question 14 január 2019 в 8:02
Programovanie
c++
const
This question has 1 odpoveď in English, to read them log in to your account.
Solution / Answer
Janick Bernet
Janick Bernet
29 jún 2010 в 1:32
2010-06-29T13:32:15+00:00
Viac na
Zdroj
Upraviť
#10657941

Funkcia "const", označená kľúčovým slovom const za deklaráciou funkcie, spôsobí, že funkcia tejto triedy zmení členskú premennú triedy, čo je chybou kompilátora. Čítanie premenných triedy vo vnútri funkcie je však v poriadku, ale zápis vo vnútri tejto funkcie vygeneruje chybu kompilátora.

Iný spôsob uvažovania o takejto "const funkcii" je pohľad na funkciu triedy ako na normálnu funkciu, ktorá preberá implicitný ukazovateľ this. Takže metóda int Foo::Bar(int random_arg) (bez const na konci) vedie k funkcii ako int Foo_Bar(Foo* this, int random_arg) a volanie ako Foo f; f.Bar(4) bude vnútorne zodpovedať niečomu ako Foo f; Foo_Bar(&f, 4). Pridanie const na koniec (int Foo::Bar(int random_arg) const) potom možno chápať ako deklaráciu s ukazovateľom const this: int Foo_Bar(const Foo* this, int random_arg). Keďže typ this je v takomto prípade const, nie sú možné žiadne modifikácie členských premenných.

Je možné uvoľniť obmedzenie "const funkcie", ktoré spočíva v tom, že funkcia nesmie zapisovať do žiadnej premennej triedy. Aby bolo možné do niektorých premenných zapisovať, aj keď je funkcia označená ako "const function", tieto premenné triedy sa označujú kľúčovým slovom mutable. Ak je teda premenná triedy označená ako mutovateľná a "const function" do tejto premennej zapisuje, potom sa kód skompiluje čisto a premennú je možné meniť. (C++11)

Ako zvyčajne pri práci s kľúčovým slovom const, zmena umiestnenia kľúčového slova const vo výroku jazyka C++ má úplne iný význam. Uvedené použitie const platí len pri pridaní const na koniec deklarácie funkcie za zátvorku.

const je v C++ veľmi často používaný kvalifikátor: syntax a usporiadanie v kombinácii s ukazovateľmi často nie sú jednoduché. Niekoľko výkladov o správnosti const a kľúčovom slove const:

Const correctness

The C++ 'const' Declaration: Why & How] Deklarácia C++: Prečo & Ako.

Pat Mächler
Pat Mächler
Edited answer 11 december 2018 в 5:34
const (computer programming) - Wikipedia
en.wikipedia.org
824
0
Artificial intelligence to parse product page
productapi.dev
 mkluwe
mkluwe
29 jún 2010 в 1:34
2010-06-29T13:34:21+00:00
Viac na
Zdroj
Upraviť
#10657979

Bar zaručene nezmení objekt, na ktorom je vyvolaný. Pozrite si napríklad časť o správnosti const v C++ FAQ.

12
0
Artificial intelligence to parse product page
productapi.dev
 JLWarlow
JLWarlow
29 jún 2010 в 1:33
2010-06-29T13:33:04+00:00
Viac na
Zdroj
Upraviť
#10657977

Podobne ako táto otázka.

V podstate to znamená, že metóda Bar nebude modifikovať ne mutovateľné členské premenné Foo.

 JLWarlow
JLWarlow
Edited answer 8 jún 2018 в 10:09
8
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Анна Литвиненко
Registered pred dňom
2
Inessa bu
Registered pred mesiacom
3
Denis Babushkin
Registered pred mesiacom
4
asakuno asakuno
Registered pred mesiacom
5
aldo salerno
Registered pred mesiacom
Artificial intelligence to parse product page
productapi.dev
BG
DE
EL
ES
FR
ID
IT
JA
KO
LV
NL
NO
PT
RO
RU
SK
TR
ZH
© kzen.dev 2023
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora