Tiga operator berbeda yang digunakan C ++ untuk mengakses anggota kelas atau objek kelas, yaitu titik dua ::
, titik .
, dan panah ->
, digunakan untuk tiga skenario berbeda yang selalu didefinisikan dengan baik. Mengetahui hal ini memungkinkan Anda untuk segera tahu cukup banyak tentang a
dan b
hanya dengan melihat a::b
, a.b
atau a->b
masing-masing, dalam kode Anda melihat.
a::b
hanya digunakan jika b
merupakan anggota kelas (atau namespace) a
. Artinya, dalam hal ini a
akan selalu menjadi nama kelas (atau namespace).
a.b
hanya digunakan jika b
merupakan anggota objek (atau referensi ke objek) a
. Jadi untuk a.b
, a
akan selalu menjadi objek aktual (atau referensi ke objek) dari suatu kelas.
a->b
adalah, pada awalnya, notasi singkatan (*a).b
. Namun, ->
adalah satu-satunya operator akses anggota yang dapat kelebihan beban, jadi jika a
objek kelas yang overloads operator->
(umum jenis tersebut adalah pointer pintar dan iterator), maka artinya adalah apa pun yang diterapkan oleh perancang kelas. Untuk menyimpulkan: Dengan a->b
, jika a
adalah pointer, b
akan menjadi anggota objek yang ditunjuk oleh pointer a
. Namun, a
jika objek kelas yang overload operator ini, maka fungsi operator overload operator->()
dipanggil.
Cetakan kecil:
- Dalam C ++, jenis dinyatakan sebagai
class
, struct
atau union
dianggap "dari jenis kelas". Jadi di atas merujuk pada ketiganya.
- Referensi adalah, semantik, alias untuk objek, jadi saya seharusnya menambahkan "atau referensi ke pointer" ke # 3 juga. Namun, saya pikir ini akan lebih membingungkan daripada membantu, karena referensi ke pointer (
T*&
) jarang digunakan.
- Operator titik dan panah dapat digunakan untuk merujuk ke anggota kelas statis dari suatu objek, meskipun mereka bukan anggota objek. (Terima kasih kepada Oli untuk menunjukkan ini!)
.
dan->
dapat juga digunakan untuk mengakses statika kelas melalui suatu objek, meskipun mereka tidak sepenuhnya "anggota objek".operator*()
juga dapat kelebihan beban, dan tidak ada yang memaksa kelebihan beban untuk konsistenoperator->()
! (Saya tidak mengungguli BTW, baru saja tiba di sini melalui serangkaian duplikat yang panjang)->
dengan kelebihan bebanoperator*
dan penggunaan.
. Hanyaoperator->
kelebihan beban yang mendapatkannya.Menyarankan alternatif untuk poin sbi 3
a->b
hanya digunakan jikaa
adalah pointer. Ini adalah singkatan untuk(*a).b
,b
anggota objek yanga
menunjuk. C ++ memiliki dua jenis pointer, "biasa" dan pointer pintar. Untuk pointer reguler sepertiA* a
, kompiler mengimplementasikan->
. Untuk pointer cerdas sepertistd::shared_ptr<A> a
,->
adalah fungsi anggota kelasshared_ptr
.Dasar Pemikiran: audiens target FAQ ini tidak menulis smart pointer. Mereka tidak perlu tahu
->
benar-benar dipanggiloperator->()
, atau bahwa itu adalah satu-satunya metode akses anggota yang dapat kelebihan beban.sumber
+1
hanya untuk memberikan jawaban alternatif.->
juga kelebihan beban untuk iterator standar yang mana setiap programmer C ++ harus segera bertemu, jadi mengatakan itu hanya digunakan untuk pointer bisa membingungkan.Dari contoh pengkodean di atas, kita melihat bahwa:
* Mengakses anggota (atribut dan fungsi) dari instance (atau objek) menggunakan operator titik (
.
)* Mengakses anggota (atribut dan fungsi) dari pointer ke objek (atau dibuat oleh
new
) menggunakan pointer operator (->
)* Mengakses fungsi anggota statis dari kelas itu sendiri tanpa memiliki objek sebagai pegangan menggunakan titik dua (
::
). [ Catatan: Anda juga dapat menjalankan fungsi anggota statis dari instance dengan.
atau->
yang tidak disarankan]sumber
->
hanya bisa digunakan oleh pointer yang dialokasikan pada heapnew
? Di bawah, item kedua, saya pikir saya benar-benar membuatnya jelas->
untuk pointer. Dan sebelum Anda downvote, Anda lebih baik mencobaclassName::non_static_member_function()
dengan c ++ 14 sendiri. Referensi bukan pointer, jadi bisa digunakan.
, dan saya akan membuatnya lebih jelas dalam jawaban saya.Operator dot digunakan dalam skenario pemilihan anggota langsung.
Di sini, kita mengakses
b
, yang merupakan anggota langsung dari suatu objeka
. Jadi, terutama,a
adalah objek danb
anggota (fungsi / variabel dll) daria
.Operator panah digunakan dalam skenario pemilihan anggota tidak langsung.
Di sini, kita mengakses
b
yang merupakan anggota objek, yang ditunjuk oleha
. Ini adalah singkatan(*a).b
dan jadi di sini,a
terutama adalah penunjuk ke objek danb
merupakan anggota dari objek itu.Operator Double Colon (Scope) digunakan dalam skenario pemilihan anggota langsung terkait namespace.
Di sini, kita mengakses
b
yang merupakan anggota dari kelas / namespacea
. Jadi, terutama,a
adalah kelas / namespace danb
merupakan anggota (fungsi / variabel dll) daria
.sumber