Co oznacza "const" na końcu deklaracji funkcji? [duplikat]

Możliwy duplikat:
Znaczenie" const " w deklaracji metody C++?

Cześć Mam książkę, w której jest napisane coś w stylu:

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

Również, przy okazji pytanie: dlaczego powinienem / nie powinienem używać const przed deklaracjami argumentów? Co to zmienia ?

int Foo (const int Bar) { /* code */ }

EDIT: Więc jeśli teraz:

Foo v1, v2;

Czy funkcja paska (const-tagged) będzie istnieć 3 razy lub 1 raz w pamięci?

 423
Author: Community, 2010-06-29

6 answers

"funkcja const", oznaczona słowem kluczowym const po deklaracji funkcji, sprawia, że błąd kompilatora dla tej funkcji klasy powoduje zmianę zmiennej członkowskiej klasy. Jednak odczyt zmiennych klasy jest ok wewnątrz funkcji, ale zapis wewnątrz tej funkcji wygeneruje błąd kompilatora.

Innym sposobem myślenia o takiej "funkcji const" jest oglądanie funkcji klasy jako funkcji normalnej, przyjmując implicit this Wskaźnik. Więc metoda int Foo::Bar(int random_arg) (bez const na końcu) daje funkcję podobną do int Foo_Bar(Foo* this, int random_arg), a wywołanie takie jak {[4] } będzie wewnętrznie odpowiadało czemuś podobnemu do Foo f; Foo_Bar(&f, 4). Teraz dodanie const na końcu (int Foo::Bar(int random_arg) const) może być rozumiane jako deklaracja z const tym wskaźnikiem: int Foo_Bar(const Foo* this, int random_arg). Ponieważ typ this w takim przypadku jest const, nie ma możliwości modyfikacji zmiennych składowych.

Możliwe jest poluzowanie ograniczenia "const function" polegającego na tym, że funkcja nie pozwala na zapis do żadnej zmiennej klasy. Aby umożliwić niektóre z zmienne, które mają być zapisywalne nawet wtedy, gdy funkcja jest oznaczona jako "funkcja const", te zmienne klasy są oznaczone słowem kluczowym mutable. Tak więc, jeśli zmienna klasy jest oznaczona jako zmienna, a" funkcja const " zapisze do tej zmiennej, to kod zostanie skompilowany czysto i zmienna będzie możliwa do zmiany. (C++11)

Jak zwykle w przypadku słowa kluczowego const zmiana lokalizacji słowa kluczowego const w instrukcji C++ ma zupełnie inne znaczenie. Powyższe wykorzystanie const stosuje się tylko przy dodawaniu const na końcu deklaracji funkcji po nawiasie. const jest wysoce nadużywanym kwalifikatorem w C++ , a składnia i kolejność często nie są proste w połączeniu ze wskaźnikami. Kilka odczytów o poprawności const i słowie kluczowym const:

Constitution

Deklaracja C++ 'const': Why & How

 731
Author: Janick Bernet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 22:58:32

Rozważmy dwie zmienne klasowe:

class Boo { ... };

Boo b0;       // mutable object
const Boo b1; // non-mutable object

Teraz możesz wywołać dowolną funkcję członka Boo on b0, ale tylko const-funkcje członka kwalifikowanego na b1.

 34
Author: Nikolai Fetissov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-29 13:36:26

Bar gwarantuje, że nie zmieni obiektu, na którym jest wywoływany. Zobacz na przykład sekcję o poprawności const W C++ FAQ.

 11
Author: mkluwe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-29 13:34:21

Podobne do to pytanie.

W istocie oznacza to, że metoda Bar nie będzie modyfikować Nie mutowalnych zmiennych członkowskich Foo.

 8
Author: JLWarlow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 10:09:47

Zawsze uważam, że koncepcyjnie łatwiej jest myśleć o tym, że tworzysz ten wskaźnik const(który jest w zasadzie tym, co robi).

 7
Author: Goz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-29 13:35:54

Funkcja nie może zmienić swoich parametrów za pomocą podanego wskaźnika / referencji.

Wchodzę na tę stronę za każdym razem, gdy muszę o tym pomyśleć:

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

Uważam, że jest też dobry rozdział w "bardziej efektywnym C++".

 7
Author: orbfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-29 15:09:36