Hari ini saya mendapat masalah. Saya membutuhkan static
fungsi anggota, const
bukan 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 static
fungsi anggota, const
bukan suatu keharusan tetapi lebih baik. Tapi, saya tidak berhasil dalam usaha saya. Adakah yang bisa mengatakan mengapa atau bagaimana?
Jawaban:
Saat Anda menerapkan const
qualifier ke fungsi anggota nonstatic, itu mempengaruhi this
penunjuk. Untuk fungsi anggota kelas yang memenuhi syarat const C
, this
penunjuknya bertipe C const*
, sedangkan untuk fungsi anggota yang tidak memenuhi syarat const, this
penunjuknya bertipe C*
.
Fungsi anggota statis tidak memiliki this
penunjuk (fungsi seperti itu tidak dipanggil pada instance kelas tertentu), jadi kualifikasi const dari fungsi anggota statis tidak masuk akal.
const
harus 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, const
dianggap dalam konteks this
. Di satu sisi, itu sempit. Itu dapat dibuat lebih luas dengan menerapkan ini const
melampaui this
penunjuk.
yaitu "diusulkan" const
, yang mungkin juga berlaku untuk static
fungsi, akan membatasi static
anggota dari modifikasi apa pun.
Pada kode contoh, jika foo()
bisa dibuat const
, maka pada fungsi itu, A::s
tidak bisa diubah. Saya tidak dapat melihat efek samping bahasa, jika aturan ini ditambahkan ke standar. Sebaliknya, sangat lucu mengapa aturan seperti itu tidak ada!
const
berlaku 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.
const
pengubah 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 const
membuat objek konstan, tetapi mungkin ada atau mungkin tidak ada objek di sini untuk tetap konstan.
this
penunjuk. (Selain itu, const
tidak 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.
const
arti fungsi anggota statis bagi Anda?