Mengapa 'ini' sebuah pointer dan bukan referensi?

183

Saya membaca jawaban untuk pertanyaan ini C + + pro dan kontra dan mendapat keraguan ini saat membaca komentar.

programmer sering merasa bingung bahwa "ini" adalah pointer tetapi bukan referensi. kebingungan lain adalah mengapa "halo" bukan tipe std :: string tetapi mengevaluasi ke char const * (pointer) (setelah konversi array ke pointer) - Johannes Schaub - litb 22 Des '08 pada 1:56

Itu hanya menunjukkan bahwa itu tidak menggunakan konvensi yang sama dengan bahasa lain (nanti). - le dorfier 22 Des 088 pukul 3:35

Saya akan menyebut "ini" masalah yang cukup sepele. Dan oops, terima kasih telah menangkap beberapa kesalahan dalam contoh perilaku tidak terdefinisi saya. :) Meskipun saya tidak mengerti info tentang ukuran apa yang ada hubungannya dengan yang pertama. Pointer sama sekali tidak diizinkan untuk menunjuk di luar memori yang dialokasikan - jalf 22 Desember '08 di 4:18

Apakah ini poiner konstan? - yesraaj 22 Des 088 di 6:35

ini bisa konstan jika metode ini adalah const int getFoo () const; <- dalam lingkup getFoo, "this" adalah konstan, dan karenanya hanya dibaca. Ini mencegah bug dan memberikan beberapa tingkat jaminan kepada pemanggil bahwa objek tidak akan berubah. - Doug T. 22 Des 08 'jam 16:42

Anda tidak dapat menetapkan kembali "ini". yaitu Anda tidak dapat melakukan "this = & other;", karena ini adalah nilai. tapi ini tipe T *, bukan tipe T const. yaitu pointer yang tidak konstan. jika Anda menggunakan metode const, maka itu adalah pointer ke const. T const. tetapi penunjuk itu sendiri tidak benar - Johannes Schaub - litb 22 Des 08 di 17:53

pikirkan "ini" seperti ini: # tentukan ini (this_ + 0) di mana kompiler membuat "this_" sebagai penunjuk ke objek dan menjadikan "ini" kata kunci. Anda tidak dapat menetapkan "ini" karena (this_ + 0) adalah nilai. tentu saja bukan seperti itu (tidak ada makro seperti itu), tetapi dapat membantu memahaminya - Johannes Schaub - litb 22 Des '08 pada 17:55

Pertanyaan saya adalah, mengapa thispointer bukan referensi? Adakah alasan khusus untuk menjadikannya pointer?


Beberapa argumen lebih lanjut mengapa thismenjadi referensi akan masuk akal:

  • Pertimbangkan Item 1dari More Effective C++ : gunakan referensi ketika dijamin bahwa kami memiliki objek yang valid, yaitu bukan NULL (interpretasi saya).
  • Lebih jauh, referensi dianggap lebih aman daripada pointer (karena kita tidak dapat mengacaukan memori dengan pointer yang tersesat).
  • Ketiga, sintaks untuk mengakses referensi ( .) sedikit lebih bagus dan lebih pendek daripada mengakses pointer ( ->atau (*)).
Naveen
sumber
5
@ paulm Apa yang sebenarnya akan dicapai "retas" ini? Tidak thisselalu dievaluasi true?
iFreilicht
6
@ paulm Saya tidak berpikir itu sebenarnya valid C ++. Menggunakan metode pada nullptr ke suatu objek menghasilkan perilaku yang tidak terdefinisi.
antred
5
@ paulm Mungkin berhasil dalam beberapa kasus, tetapi bayangkan jika metode itu adalah virutal. Bagaimana pencarian tabel-v dapat dilakukan tanpa objek?
Jason Creighton
3
@paulm Jika Anda melihatnya dalam kode produksi, abaikan kapal! Itu adalah UB.
Alice
6
Aku hanya akan meninggalkan ini di sini ... (dari afxwin2.inl MFC):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Christopher Oicles

Jawaban:

176

Ketika bahasa pertama kali berevolusi, dalam rilis awal dengan pengguna nyata, tidak ada referensi, hanya petunjuk. Referensi ditambahkan ketika operator kelebihan beban ditambahkan, karena memerlukan referensi untuk bekerja secara konsisten.

Salah satu kegunaan dari objek thisadalah untuk mendapatkan pointer ke dirinya sendiri. Jika itu referensi, kita harus menulis &this. Di sisi lain, ketika kita menulis operator penugasan kita harus return *this, yang akan terlihat lebih sederhana return this. Jadi jika Anda memiliki batu tulis kosong, Anda bisa membantahnya. Tetapi C ++ berkembang secara bertahap sebagai tanggapan terhadap umpan balik dari komunitas pengguna (seperti hal-hal yang paling sukses). Nilai kompatibilitas ke belakang benar-benar melebihi keuntungan / kerugian kecil yang berasal dari thismenjadi referensi atau pointer.

Daniel Earwicker
sumber
4
Yah, itu juga sering berguna bagi objek untuk mendapatkan referensi ke dirinya sendiri. Saya akan mengatakan itu penggunaan yang lebih umum. Bagaimanapun, alasan utamanya adalah seperti yang Anda katakan, referensi tidak ada ketika mereka membuat pointer 'ini'.
jalf
20
Dan, jika ini adalah referensi, akan sulit operator &untuk melakukan sesuatu yang bermanfaat. Harus ada beberapa sintaks khusus untuk mendapatkan alamat ini yang tidak akan melalui operator &.
Mahakuasa
10
@conio - Anda mungkin ingin memeriksa bahwa lain kali Anda dekat dengan kompiler C ++! :) Sesuatu seperti:int n = 5; int &r = n; int *p = &r; std::cout << *p;
Daniel Earwicker
14
@Omnifarious Anda bisa menulis &reinterpret_cast<char&>(this);untuk mendapatkan alamat asli untuk overloading operator&(pada kenyataannya, ini semacam apa boost::addressof).
Johannes Schaub - litb
9
Karena itu tidak masuk akal untuk thismenjadi nol, menurut saya referensi lebih cocok.
Ponkadoodle
114

Sedikit terlambat ke pesta ... Langsung dari mulut kuda, inilah yang dikatakan Bjarne Stroustrup (yang pada dasarnya diulangi atau diambil dari buku "Desain dan Evolusi C ++"):

Mengapa " this" bukan referensi?

Karena "ini" diperkenalkan ke C ++ (benar-benar ke dalam C dengan Kelas) sebelum referensi ditambahkan. Juga, saya memilih " this" untuk mengikuti penggunaan Simula, daripada menggunakan "diri" Smalltalk (nanti).

Michael Burr
sumber
2
Ya, diri akan menyenangkan untuk konsistensi dengan bahasa lain, oh well.
pilkch