Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kata kunci const dan volatil mengubah cara pointer diperlakukan. Kata const
kunci menentukan bahwa penunjuk tidak dapat dimodifikasi setelah inisialisasi; penunjuk dilindungi dari modifikasi setelahnya.
Kata volatile
kunci menentukan bahwa nilai yang terkait dengan nama berikut dapat dimodifikasi oleh tindakan selain yang ada di aplikasi pengguna. Oleh karena itu, volatile
kata kunci berguna untuk mendeklarasikan objek dalam memori bersama yang dapat diakses oleh beberapa proses atau area data global yang digunakan untuk komunikasi dengan rutinitas layanan yang mengganggu.
Ketika nama dinyatakan sebagai volatile
, pengkompilasi memuat ulang nilai dari memori setiap kali diakses oleh program. Ini secara dramatis mengurangi kemungkinan pengoptimalan. Namun, ketika status objek dapat berubah secara tiba-tiba, itu adalah satu-satunya cara untuk memastikan performa program yang dapat diprediksi.
Untuk mendeklarasikan objek yang ditujukkan oleh penunjuk sebagai const
atau volatile
, gunakan deklarasi formulir:
const char *cpch;
volatile char *vpch;
Untuk mendeklarasikan nilai penunjuk — yaitu, alamat aktual yang disimpan dalam pointer — sebagai const
atau volatile
, gunakan deklarasi formulir:
char * const pchc;
char * volatile pchv;
Bahasa C++ mencegah penugasan yang akan memungkinkan modifikasi objek atau pointer yang dinyatakan sebagai const
. Penetapan tersebut akan menghapus informasi yang dinyatakan dengan objek atau penunjuk, sehingga melanggar niat deklarasi asli. Pertimbangkan deklarasi berikut:
const char cch = 'A';
char ch = 'B';
Mengingat deklarasi sebelumnya dari dua objek (cch
, jenis karakter const, dan ch
, dari jenis karakter), deklarasi/inisialisasi berikut valid:
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;
Deklarasi/inisialisasi berikut salah.
char *pch2 = &cch; // Error
char *const pch3 = &cch; // Error
Deklarasi pch2
mendeklarasikan penunjuk di mana objek konstanta mungkin dimodifikasi dan oleh karena itu tidak diizinkan. Deklarasi pch3
menentukan bahwa penunjuk konstanta, bukan objek; deklarasi tidak diizinkan karena alasan pch2
yang sama deklarasi tidak diizinkan.
Delapan tugas berikut menunjukkan penetapan melalui penunjuk dan perubahan nilai penunjuk untuk deklarasi sebelumnya; untuk saat ini, asumsikan bahwa inisialisasi sudah benar melalui pch1
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
Pointer dinyatakan sebagai volatile
, atau sebagai campuran dan const
volatile
, patuhi aturan yang sama.
Penunjuk ke const
objek sering digunakan dalam deklarasi fungsi sebagai berikut:
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
Pernyataan sebelumnya mendeklarasikan fungsi, strcpy_s, di mana dua dari tiga argumen berjenis pointer ke char
. Karena argumen diteruskan oleh referensi dan bukan berdasarkan nilai, fungsi akan bebas untuk memodifikasi keduanya strDestination
dan strSource
jika strSource
tidak dideklarasikan sebagai const
. Deklarasi strSource
sebagai const
meyakinkan pemanggil yang strSource
tidak dapat diubah oleh fungsi yang disebut.
Catatan
Karena ada konversi standar dari typename * ke const
typename *, legal untuk meneruskan argumen jenis char *
ke strcpy_s. Namun, sebaliknya tidak benar; tidak ada konversi implisit untuk menghapus const
atribut dari objek atau penunjuk.
const
Penunjuk dari jenis tertentu dapat ditetapkan ke penunjuk dengan jenis yang sama. Namun, penunjuk yang tidak const
dapat ditetapkan ke const
penunjuk. Kode berikut menunjukkan penugasan yang benar dan salah:
// const_pointer.cpp
int *const cpObject = 0;
int *pObject;
int main() {
pObject = cpObject;
cpObject = pObject; // C3892
}
Contoh berikut menunjukkan cara mendeklarasikan objek sebagai const jika Anda memiliki pointer ke penunjuk ke objek.
// 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;
}