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 this
pointer bukan referensi? Adakah alasan khusus untuk menjadikannya pointer?
Beberapa argumen lebih lanjut mengapa this
menjadi referensi akan masuk akal:
- Pertimbangkan
Item 1
dariMore 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(*)
).
this
selalu dievaluasitrue
?_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Jawaban:
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
this
adalah untuk mendapatkan pointer ke dirinya sendiri. Jika itu referensi, kita harus menulis&this
. Di sisi lain, ketika kita menulis operator penugasan kita harusreturn *this
, yang akan terlihat lebih sederhanareturn 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 darithis
menjadi referensi atau pointer.sumber
operator &
untuk melakukan sesuatu yang bermanfaat. Harus ada beberapa sintaks khusus untuk mendapatkan alamat ini yang tidak akan melaluioperator &
.int n = 5; int &r = n; int *p = &r; std::cout << *p;
&reinterpret_cast<char&>(this);
untuk mendapatkan alamat asli untuk overloadingoperator&
(pada kenyataannya, ini semacam apaboost::addressof
).this
menjadi nol, menurut saya referensi lebih cocok.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 ++"):
sumber