Typ ukazatele this
Typ ukazatele this může být v deklaraci funkce upraven klíčovými slovy const a volatile.Chcete-li deklarovat funkci tak, aby měla atributy jednoho nebo více těchto klíčových slov, přidejte tato slova za seznam argumentů funkce.
Vezměme si jako příklad:
// type_of_this_pointer1.cpp
class Point
{
unsigned X() const;
};
int main()
{
}
Předchozí kód deklaruje členskou funkci X, v níž je ukazatel this považován za ukazatel const na objekt const.Lze použít kombinace možností cv-mod-list, ale ty vždy upravují objekt, na který ukazatel this ukazuje, nikoli ukazatel this samotný.Proto následující deklarace deklaruje funkci X. Ukazatel this je ukazatel const na objekt const:
// type_of_this_pointer2.cpp
class Point
{
unsigned X() const;
};
int main()
{
}
Typ ukazatele this v členské funkci je popsán následující syntaxí, kde seznam-kvalifikátorů-cv je vyhodnocen z deklarátorů členských funkcí a může obsahovat modifikátor const nebo volatile (nebo oba), a typ-třídy je název třídy:
[seznam-kvalifikátorů-cv] typ-třídy * const this
Jinými slovy, ukazatel this je vždy konstantním ukazatelem. Nelze do něj přiřadit jinou hodnotu. Kvalifikátory const nebo volatile použité v deklaracích členských funkcí platí pro instanci třídy, na kterou ukazuje ukazatel this v rozsahu dané funkce.
Následující tabulka podává další informace o tom, jak tyto modifikátory fungují.
Sémantika modifikátorů this
Modifikátor |
Význam |
---|---|
const |
Nelze změnit členská data. Nelze vyvolat členskou funkci, která neobsahuje modifikátor const. |
volatile |
Členská data jsou načtena z paměti při každém přístupu k nim. Zakáže některé optimalizace. |
Předání objektu const členské funkci, která modifikátor const neobsahuje, je chybou.Obdobně je chybou předání objektu volatile členské funkci, která neobsahuje modifikátor volatile.
Členské funkce deklarované modifikátorem const nemohou změnit členská data — v takových funkcích je ukazatel this ukazatelem na objekt const.
[!POZNÁMKA]
Konstruktory a destruktory nelze deklarovat s modifikátorem const nebo volatile.Mohou však být vyvolány objekty const nebo volatile.