Hari ini saya mendapat masalah. Saya membutuhkan staticfungsi anggota, constbukan suatu keharusan tetapi lebih baik. Tapi, saya tidak berhasil dalam usaha saya. Adakah yang bisa mengatakan mengapa atau bagaimana?
Hari ini saya mendapat masalah. Saya membutuhkan staticfungsi anggota, constbukan suatu keharusan tetapi lebih baik. Tapi, saya tidak berhasil dalam usaha saya. Adakah yang bisa mengatakan mengapa atau bagaimana?
Jawaban:
Saat Anda menerapkan constqualifier ke fungsi anggota nonstatic, itu mempengaruhi thispenunjuk. Untuk fungsi anggota kelas yang memenuhi syarat const C, thispenunjuknya bertipe C const*, sedangkan untuk fungsi anggota yang tidak memenuhi syarat const, thispenunjuknya bertipe C*.
Fungsi anggota statis tidak memiliki thispenunjuk (fungsi seperti itu tidak dipanggil pada instance kelas tertentu), jadi kualifikasi const dari fungsi anggota statis tidak masuk akal.
constharus sama untuk anggota statis seperti untuk yang non-statis. Sebagai contoh yang tidak dimiliki pemikiran itu, perhatikan artinya static, yang bergantung pada konteksnya.
C const*atau const C*?
Saya setuju dengan pertanyaan Anda, tapi sayangnya C ++ didesain seperti itu. Sebagai contoh:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
Pada hari ini, constdianggap dalam konteks this. Di satu sisi, itu sempit. Itu dapat dibuat lebih luas dengan menerapkan ini constmelampaui thispenunjuk.
yaitu "diusulkan" const, yang mungkin juga berlaku untuk staticfungsi, akan membatasi staticanggota dari modifikasi apa pun.
Pada kode contoh, jika foo()bisa dibuat const, maka pada fungsi itu, A::stidak bisa diubah. Saya tidak dapat melihat efek samping bahasa, jika aturan ini ditambahkan ke standar. Sebaliknya, sangat lucu mengapa aturan seperti itu tidak ada!
constberlaku untuk sebuah objek (dalam kasus fungsi anggota const, instance yang dipanggil). Anda ingin membuatnya berlaku untuk semua anggota statis kelas, saya kira jika itu dipertimbangkan sama sekali oleh komite, maka itu tidak dianggap sebagai persyaratan yang cukup umum untuk didukung.
constpengubah tidak diterapkan untuk metode anggota atau variabel anggota, tetapi untuk implisit this-pointer. Karena metode anggota statis tidak terikat ke objek, tidak ada this-pointer yang harus dibuat const.
Tanpa masuk ke detailnya, itu karena mungkin ada atau tidak ada objek yang dimodifikasi oleh fungsi, jadi const ambigu bagi kompiler.
Ingatlah yang constmembuat objek konstan, tetapi mungkin ada atau mungkin tidak ada objek di sini untuk tetap konstan.
thispenunjuk. (Selain itu, consttidak membuat objek konstan. Ini mencegah penunjuk atau referensi tertentu digunakan untuk memodifikasi objek, tetapi modifikasi mungkin masih terjadi melalui jalur lain)
Sangat disayangkan bahwa C ++ tidak menerimanya sesuai desain tetapi secara logis ada beberapa kasus penggunaan yang divalidasi dengan baik.
Sebuah fungsi yang valid tingkat kelas (statis) mungkin tidak mengubah data statis apapun, mungkin itu hanya data query harus const. Mungkin harus seperti itu
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
'Fungsi anggota const' tidak diperbolehkan untuk mengubah objek yang dipanggil, tetapi fungsi anggota statis tidak dipanggil pada objek apa pun. Ini digunakan secara langsung oleh operator resolusi lingkup. Jadi memiliki fungsi anggota statis const tidak masuk akal, karena itu ilegal.
constarti fungsi anggota statis bagi Anda?