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?
c++
static
language-lawyer
const-method
prabhakaran
sumber
sumber
const
arti fungsi anggota statis bagi Anda?Jawaban:
Saat Anda menerapkan
const
qualifier ke fungsi anggota nonstatic, itu mempengaruhithis
penunjuk. Untuk fungsi anggota kelas yang memenuhi syarat constC
,this
penunjuknya bertipeC const*
, sedangkan untuk fungsi anggota yang tidak memenuhi syarat const,this
penunjuknya bertipeC*
.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.sumber
const
harus sama untuk anggota statis seperti untuk yang non-statis. Sebagai contoh yang tidak dimiliki pemikiran itu, perhatikan artinyastatic
, yang bergantung pada konteksnya.C const*
atauconst 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 konteksthis
. Di satu sisi, itu sempit. Itu dapat dibuat lebih luas dengan menerapkan iniconst
melampauithis
penunjuk.yaitu "diusulkan"
const
, yang mungkin juga berlaku untukstatic
fungsi, akan membatasistatic
anggota dari modifikasi apa pun.Pada kode contoh, jika
foo()
bisa dibuatconst
, 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!sumber
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 implisitthis
-pointer. Karena metode anggota statis tidak terikat ke objek, tidak adathis
-pointer yang harus dibuatconst
.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.sumber
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
sumber
'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.
sumber