Mempertimbangkan:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
Apakah kedua fungsi ini sama di setiap aspek atau ada perbedaan?
Saya tertarik dengan jawaban untuk bahasa C, tetapi jika ada sesuatu yang menarik dalam bahasa C ++, saya ingin mengetahuinya juga.
Jawaban:
const T
danT const
identik. Dengan tipe pointer, ini menjadi lebih rumit:const char*
adalah penunjuk ke sebuah konstantachar
char const*
adalah penunjuk ke sebuah konstantachar
char* const
adalah penunjuk konstan ke (bisa berubah)char
Dengan kata lain, (1) dan (2) identik. Satu-satunya cara untuk membuat pointer (daripada pointee)
const
adalah dengan menggunakan sufiks-const
.Inilah sebabnya mengapa banyak orang lebih suka untuk selalu menempatkan
const
di sisi kanan jenis (gaya "East const"): ini membuat lokasinya relatif terhadap jenis yang konsisten dan mudah diingat (juga secara anekdot tampaknya membuatnya lebih mudah untuk diajarkan kepada pemula ).sumber
Triknya adalah membaca deklarasi secara terbalik (kanan-ke-kiri):
Keduanya adalah hal yang sama. Karena itu:
Trik membaca mundur sangat berguna ketika Anda berurusan dengan deklarasi yang lebih kompleks seperti:
sumber
char const *
, dibaca dari kiri ke kanan adalah: "pointer, const, char". Ini adalah penunjuk ke const char. Saat Anda mengatakan "penunjuk yang konstan", kata sifat "konstan" ada di penunjuk. Jadi, untuk kasus ini, daftar kata sifat Anda seharusnya benar-benar: "const, pointer, char". Tapi Anda benar, ada ambiguitas dalam trik ini. Ini benar-benar sebuah "tipuan", lebih dari sekedar "aturan" yang pasti.Tidak ada perbedaan. Keduanya menyatakan "a" sebagai bilangan bulat yang tidak dapat diubah.
Tempat di mana perbedaan mulai muncul adalah saat Anda menggunakan petunjuk.
Keduanya:
mendeklarasikan "a" sebagai penunjuk ke integer yang tidak berubah. "a" bisa ditetapkan ke, tapi "* a" tidak bisa.
menyatakan "a" sebagai penunjuk konstan ke integer. "* a" bisa ditetapkan ke, tapi "a" tidak bisa.
menyatakan "a" sebagai penunjuk konstan ke bilangan bulat konstan. Baik "a" maupun "* a" tidak dapat ditetapkan ke.
sumber
Prakash benar bahwa deklarasinya sama, meskipun sedikit lebih banyak penjelasan tentang kasus penunjuk mungkin sesuai.
"const int * p" adalah penunjuk ke int yang tidak mengizinkan int untuk diubah melalui penunjuk itu. "int * const p" adalah penunjuk ke int yang tidak bisa diubah untuk menunjuk ke int lain.
Lihat https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const .
sumber
const int
identik denganint const
, seperti halnya dengan semua jenis skalar di C. Secara umum, mendeklarasikan parameter fungsi skalar sebagaiconst
tidak diperlukan, karena semantik panggilan-demi-nilai C berarti bahwa setiap perubahan pada variabel bersifat lokal ke fungsi penutupnya.sumber
Ini bukan jawaban langsung tetapi tip terkait. Untuk menjaga hal-hal tetap lurus, saya selalu menggunakan konveksi "letakkan
const
di luar", sedangkan "di luar" yang saya maksud adalah paling kiri atau paling kanan. Dengan cara itu tidak ada kebingungan - const berlaku untuk hal terdekat (baik tipe atau*
). Misalnya,sumber
Keduanya sama, tetapi di C ++ ada alasan bagus untuk selalu menggunakan const di sebelah kanan. Anda akan konsisten di mana-mana karena fungsi anggota const harus dideklarasikan dengan cara ini:
Ini mengubah
this
penunjuk dalam fungsi dariFoo * const
menjadiFoo const * const
. Lihat disini.sumber
Ya, mereka sama saja
int
dan berbeda untuk
int*
sumber
Saya pikir dalam hal ini mereka sama, tetapi berikut adalah contoh di mana urutan itu penting:
sumber