C ++ - Mengapa fungsi anggota statis tidak dapat dibuat dengan kualifikasi 'const'

87

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?

prabhakaran
sumber
1
Apa constarti fungsi anggota statis bagi Anda?
GManNickG
2
@GMan Maksud saya bahwa fungsi anggota statis yang tidak pernah mengubah inputnya.
prabhakaran
11
Kemudian masukan Anda (parameter fungsi) harus berdasarkan nilai atau referensi konstanta.
GManNickG
4
Itu tidak mempengaruhi keteguhan argumen fungsi anggota. Itu tidak berarti "buat semuanya const", itu berarti "jadikan ini const".
UncleBens
@GMan, apakah Anda mengatakan bahwa const harus ditambahkan ke argumen
prabhakaran

Jawaban:

139

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.

James McNellis
sumber
Apakah ini berarti 'const' hanya untuk variabel seperti int, pointer, dll.?
prabhakaran
@prabhakaran - Anggota fungsi dapat const memenuhi syarat juga. James dengan jelas menyebutkannya dalam jawabannya.
Mahesh
Kualifikasi const fungsi Anggota @Mahesh juga, hanya mengkualifikasi 'penunjuk ini', bukan keseluruhan. Anda masih dapat mengubah variabel global dalam fungsi anggota yang memenuhi syarat const. Sekarang hanya saya yang memeriksa ini.
prabhakaran
5
-1 "Fungsi anggota statis tidak memiliki penunjuk ini ... jadi kualifikasi const dari fungsi anggota statis tidak masuk akal [dengan cara itu]" adalah benar dalam dirinya sendiri tetapi salah sebagai jawaban atas pertanyaan "mengapa ". Sebagai jawaban, ini mengasumsikan bahwa arti dari constharus sama untuk anggota statis seperti untuk yang non-statis. Sebagai contoh yang tidak dimiliki pemikiran itu, perhatikan artinya static, yang bergantung pada konteksnya.
Cheers and hth. - Alf
2
Apakah itu C const*atau const C*?
crisron
24

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!

iammilind
sumber
8
Mungkin sama dengan alasan Anda tidak dapat mengubah konstanta fungsi bebas yang berarti "fungsi ini tidak mengubah variabel global apa pun". 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.
Steve Jessop
1
The 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.
Ruud Althuizen
0

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.

Don Larynx
sumber
2
"mungkin atau mungkin tidak"? Fungsi anggota statis tidak pernah memiliki 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)
Ben Voigt
0

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
Raghavendar Reddy
sumber
0

'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.

nihal dixit
sumber