Jakie jest znaczenie const
takich deklaracji? const
Myli mnie.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
źródło
Jakie jest znaczenie const
takich deklaracji? const
Myli mnie.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
Po dodaniu const
słowa kluczowego do metody this
wskaźnik zasadniczo stanie się wskaźnikiem do const
obiektu, a zatem nie można zmienić żadnych danych elementu. (O ile nie użyjesz mutable
, więcej o tym później).
Słowo const
kluczowe jest częścią sygnatury funkcji, co oznacza, że możesz zaimplementować dwie podobne metody, jedną wywoływaną, gdy obiekt jest const
, a drugą nie.
#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();
}
To wyjdzie
Foo
Foo const
W metodzie innej niż const możesz zmienić członków instancji, czego nie można zrobić w const
wersji. Jeśli zmienisz deklarację metody w powyższym przykładzie na poniższy kod, pojawi się kilka błędów.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
Nie jest to do końca prawdą, ponieważ można oznaczyć członka jako, mutable
a const
następnie metoda może go zmienić. Najczęściej jest używany do liczników wewnętrznych i innych rzeczy. Rozwiązaniem tego byłby poniższy kod.
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; // This works because counter is `mutable`
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 << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
}
co by wydało
Foo
Foo const
Foo has been invoked 2 times
Const oznacza, że metoda obiecuje nie zmieniać żadnych członków klasy. Będziesz w stanie wykonać elementy obiektu, które są tak oznaczone, nawet jeśli sam obiekt został oznaczony const
:
const foobar fb;
fb.foo();
byłoby legalne.
Zobacz, ile i jakie są zastosowania „const” w C ++? po więcej informacji.
Te const
środki kwalifikacyjne, że metody można nazwać na dowolnej wartości foobar
. Różnica pojawia się, gdy rozważymy wywołanie metody innej niż const na obiekcie const. Zastanów się, czy Twój foobar
typ ma następującą deklarację metody dodatkowej:
class foobar {
...
const char* bar();
}
Metoda bar()
nie jest stała i można uzyskać do niej dostęp wyłącznie z wartości innych niż stała.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
Ideą const
jest jednak oznaczenie metod, które nie zmienią wewnętrznego stanu klasy. Jest to potężna koncepcja, ale w rzeczywistości nie jest możliwa do wyegzekwowania w C ++. To bardziej obietnica niż gwarancja. I taki, który jest często łamany i łatwo łamany.
foobar& fbNonConst = const_cast<foobar&>(fb1);
const
jest oznaczenie metod, które nie zmienią wewnętrznego stanu klasy”. Właśnie tego szukałem.const
?Te const oznaczają, że kompilator wykona błąd, jeśli metoda „with const” zmieni dane wewnętrzne.
Test
Przeczytaj to, aby uzyskać więcej informacji
źródło
const
funkcje składowe, które nie wspomina o zmiennej, jest w najlepszym razie niepełne.Odpowiedź Blair jest na znaku.
Należy jednak pamiętać, że istnieje element
mutable
kwalifikujący, który można dodać do elementów danych klasy. Każdy członek oznaczony w ten sposób może być modyfikowanyconst
metodą bez naruszaniaconst
umowy.Możesz użyć tego (na przykład), jeśli chcesz, aby obiekt pamiętał, ile razy jest wywoływana określona metoda, nie wpływając na „logiczną” stałość tej metody.
źródło
Znaczenie stałej funkcji członka w C ++ Common Knowledge: Essential Intermediate Programming daje jasne wyjaśnienie:
W twoim kodzie:
Możesz myśleć tak:
źródło
this
nie jestconst
. Powodem, dla którego nie można go modyfikować, jest to, że jest to wartość.kiedy używasz
const
w sygnaturze metody (jak powiedziałeśconst char* foo() const;
:), mówisz kompilatorowi, że wskazanej przez pamięć pamięcithis
nie można zmienić tą metodą (która jestfoo
tutaj).źródło
Chciałbym dodać następujący punkt.
Możesz także zrobić to
const &
aconst &&
Więc,
Popraw odpowiedź. Nie jestem ekspertem
źródło
*this
jest zawsze wartością, nawet jeśli funkcja składowa ma kwalifikację-wartości-referencyjnej i jest wywoływana na wartości. Przykład .Const kluczowe używany z Określa deklaracji funkcji, że jest to funkcja członkiem const i to będzie nie być w stanie zmienić członków danych obiektu.
źródło
https://isocpp.org/wiki/faq/const-correctness#const-member-fns
źródło