Const a těkavé ukazatele
Const a těkavých změnit klíčová slova, jak jsou zpracovány ukazatele.Const klíčové slovo určuje, že nelze změnit ukazatel po inicializaci; ukazatel je chráněna před změnou poté.
volatile Klíčové slovo určuje, že akce jiných než v uživatelské aplikaci mohou upravovat hodnoty spojené s názvem, který následuje.Proto volatile klíčové slovo je užitečné pro deklarování objekty ve sdílené paměti, které lze získat přístup více procesů nebo oblasti globální data pro komunikaci s službu rutiny přerušení.
Pokud je název deklarován jako volatile, kompilátor znovu načte hodnotu z paměti při každém přistupuje program.Možné optimalizace výrazně sníží.Když stav objektu může neočekávaně změnit, je však jediným způsobem zajištění výkonu předvídatelné programu.
Prohlásit objekt odkazuje ukazatel jako const nebo volatile, použijte formulář prohlášení:
const char *cpch;
volatile char *vpch;
Deklarovat hodnotu ukazatele –, skutečné adresy uložené v ukazatel – jako const nebo volatile, použijte formulář prohlášení:
char * const pchc;
char * volatile pchv;
Jazyk C++ zabrání přiřazení, která by umožňovala úpravy objektu nebo ukazatel deklarován jako const.Takové přiřazení by odstranit informace, které objekt nebo ukazatel byl deklarován s, a tím porušil záměr původní prohlášení.Zvažte následující prohlášení:
const char cch = 'A';
char ch = 'B';
Uvedené předchozí prohlášení dva objekty (cch, typ const char, a ch, typu char), platí následující prohlášení/inicializace:
const char *pch1 = &cch;
const char *const pch4 = &cch;
const char *pch5 = &ch;
char *pch6 = &ch;
char *const pch7 = &ch;
const char *const pch8 = &ch;
Následující prohlášení/inicializací jsou chybné.
char *pch2 = &cch; // Error
char *const pch3 = &cch; // Error
Prohlášení o pch2 prohlašuje ukazatel, pomocí kterého konstantní objektu mohou být změněna a není proto povolena.Prohlášení o pch3 Určuje, že pointer je konstanta, není objekt; prohlášení je zakázán z téhož důvodu pch2 prohlášení je zakázán.
Následující přiřazení osm zobrazit přiřazení pomocí ukazatele a změna hodnoty ukazatele pro předchozí prohlášení; Nyní předpokládejme, že bylo správné pro inicializaci pch1 prostřednictvím pch8.
*pch1 = 'A'; // Error: object declared const
pch1 = &ch; // OK: pointer not declared const
*pch2 = 'A'; // OK: normal pointer
pch2 = &ch; // OK: normal pointer
*pch3 = 'A'; // OK: object not declared const
pch3 = &ch; // Error: pointer declared const
*pch4 = 'A'; // Error: object declared const
pch4 = &ch; // Error: pointer declared const
Ukazatele deklarován jako volatile, nebo jako směs const a volatile, dodržovat stejná pravidla.
Odkazy na const objekty se často používají v deklarace funkce takto:
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
Předchozí prohlášení deklaruje funkci, strcpy_s, kde jsou dvě tři argumenty typ ukazatele na char.Protože argumenty předávány formou odkazu a hodnotu funkce by být volné změňte oba strDestination a strSource -li strSource není deklarován jako const.Prohlášení o strSource jako const zajišťuje volajícího, který strSource nemůže změnit volaná funkce.
[!POZNÁMKA]
Protože standardního převodu z typename* na consttypename*, je možné předat argument typu char * na strcpy_s. Naopak však není pravda; neexistuje žádná implicitní převod odebrat const atributu z objektu nebo ukazatel.
A b ukazatel daného typu lze přiřadit ukazatel stejného typu.Ukazatel, není však const nelze přiřadit const ukazatel.Následující kód ukazuje správné a nesprávné přiřazení:
// const_pointer.cpp
int *const cpObject = 0;
int *pObject;
int main() {
pObject = cpObject;
cpObject = pObject; // C3892
}
Následující příklad ukazuje, jak deklarovat objekt jako argument, máte-li ukazatel myši na ukazatel na objekt.
// const_pointer2.cpp
struct X {
X(int i) : m_i(i) { }
int m_i;
};
int main() {
// correct
const X cx(10);
const X * pcx = &cx;
const X ** ppcx = &pcx;
// also correct
X const cx2(20);
X const * pcx2 = &cx2;
X const ** ppcx2 = &pcx2;
}