Const i lotnych wskaźniki
Const i lotnych zmienić słowa kluczowe, traktowane są jak wskaźniki.Const słowa kluczowego Określa, że wskaźnik nie mogą być modyfikowane po zainicjowaniu; wskaźnik jest chroniony przed modyfikacją po tej dacie.
volatile Słowa kluczowego Określa, że wartość skojarzona z nazwą, który następuje mogą być modyfikowane przez akcje, inne niż te w aplikacji użytkownika.W związku z tym volatile słowo kluczowe jest przydatne w przypadku deklarowania obiektów w pamięci współużytkowanej, do którego dostęp przez wiele procesów lub obszary danych globalnych, używana do komunikacji z procedury usługi przerwania.
Kiedy nazwa jest zadeklarowana jako volatile, kompilator ładuje wartości z pamięci po każdorazowym, jest dostęp przez program.To znacznie zmniejsza możliwe optymalizacje.Jednakże gdy stan obiektu można zmienić nieoczekiwanie, jest jedynym sposobem zapewnienia wydajności programu przewidywalne.
Aby zadeklarować obiektu wskazywanej przez kursor jako const lub volatile, użyj deklaracji formularza:
const char *cpch;
volatile char *vpch;
Aby zadeklarować wartość wskaźnika — czyli rzeczywisty adres przechowywane w wskaźnik — jako const lub volatile, użyj deklaracji formularza:
char * const pchc;
char * volatile pchv;
Język C++ uniemożliwia przydziały, które pozwoliłyby modyfikacji obiektu lub wskaźnik zadeklarowanych jako const.Takie przydziały spowoduje usunięcie informacji, że obiekt lub wskaźnik został uznany, tym samym wywierających intencji zgłoszenia pierwotnego.Należy wziąć pod uwagę następujące deklaracje:
const char cch = 'A';
char ch = 'B';
Biorąc pod uwagę deklaracje poprzednich dwóch obiektów (cch, typu const char, i ch, typu char), deklaracja/inicjowania są prawidłowe:
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;
Deklaracja/inicjowania są błędne.
char *pch2 = &cch; // Error
char *const pch3 = &cch; // Error
Deklaracja z pch2 deklaruje wskaźnik, za pomocą którego stała obiektu mogą zostać zmodyfikowane i dlatego jest niedozwolona.Deklaracja z pch3 Określa, że pointer jest stałą, nie obiekt; Deklaracja jest niedozwolona dla tego samego powodu pch2 zgłoszenie jest niedozwolone.
Następujące przypisania ośmiu Pokaż przypisywanie poprzez wskaźnik i zmiana wartości wskaźnika dla poprzedniego deklaracji; teraz, założono, że inicjowanie była prawidłowa dla pch1 przez 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
Wskaźniki zadeklarowany jako volatile, lub jako mieszaniny const i volatile, przestrzegać tych samych reguł.
Wskaźniki do const obiekty są często używane w deklaracji funkcji w następujący sposób:
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
Instrukcja poprzedniego deklaruje funkcję, strcpy_s, gdzie są dwa z trzech argumentów typu wskaźnik, aby char.Ponieważ argumenty są przekazywane przez odwołanie, a nie według wartości, funkcja miałby swobodę zmodyfikuj oba strDestination i strSource Jeśli strSource nie zostały zgłoszone jako const.Deklaracja z strSource jako const wywołujący gwarantuje, że strSource wywołana funkcja nie może zmienić.
[!UWAGA]
Ponieważ standardową konwersją z typename* do consttypename*, dopuszczalne jest do przekazywania argumentu typu char * do strcpy_s. Jednakże odwrotnej nie jest prawdziwe; istnieje niejawna konwersja, aby usunąć const atrybutu z obiektu lub wskaźnik.
A const wskaźnik danego typu może być przypisana do wskaźnika tego samego typu.Jednakże wskaźnik nie jest to const nie można przypisać do const wskaźnik.Poniższy kod ilustruje prawidłowe i nieprawidłowe przypisania:
// const_pointer.cpp
int *const cpObject = 0;
int *pObject;
int main() {
pObject = cpObject;
cpObject = pObject; // C3892
}
Poniższy przykład pokazuje, jak zadeklarować obiektu jako const, jeśli wskaźnik do wskaźnika do obiektu.
// 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;
}