Apa yang dapat saya gunakan selain operator panah, `->`?


112

Untuk apa operator panah ( ->) memiliki sinonim?

Jawaban:


148

Dua ekspresi berikut ini setara:

a->b

(*a).b

(tunduk pada kelebihan beban operator, seperti yang disebutkan Konrad, tapi itu tidak biasa).


9
Masalah kelebihan beban jauh lebih biasa dari yang Anda pikirkan. Belum lama ini, implementor STL tidak memiliki ->operator yang kelebihan beban untuk beberapa jenis iterator sehingga Anda harus menggunakannya *.. Banyak perpustakaan mendefinisikannya secara tidak konsisten. Menjadi sangat menjengkelkan ketika Anda bekerja dengan template dan tidak tahu jenis tepatnya.
Konrad Rudolph

1
Anda juga bisa melakukan a[0].bsebagai gantinya (*a).b. Tapi itu tidak akan terstruktur dengan baik.
Sellorio

2
Wah, setelah bertahun-tahun pemrograman c #, kembali ke c ++ tidak hanya melelahkan secara kognitif, sintaks c ++ juga jelek dan menjijikkan. Saya merasa ingin mandi setelah menggunakannya. Program yang ditulis dalam c dan c ++ hanya mendorong pemrograman yang buruk. Apple, pre-unix, kesulitan membuat bahasanya secantik Pascal.
ATL_DEV

@ATL_DEV Saya berpendapat bahwa banyak hal jelek tidak dianggap idiomatik lagi, tapi sayangnya itu tidak berarti Anda tidak mampu untuk tidak terbiasa dengan itu sebagai pemrogram C ++ berlatih. Juga jalur yang bagus secara sintaksis seringkali bukan jalur yang bagus secara semantik, tetapi itu juga telah menjadi lebih baik bukan lebih buruk. Tapi sekali lagi saya mengidap C ++ Stockholm Syndrome.
Tim Seguine

@TimSeguine Jika Anda ingin melihat kode cantik, lihat dokumentasi di dalam Macintosh. Saya pikir mereka menemukan CamelCase. Nama variabel yang sangat deskriptif dan kode yang diformat dengan elegan. Mereka berhasil membuat kode C mereka nanti hampir secantik kode Pascal mereka sebelumnya.
ATL_DEV

70

a->bumumnya merupakan sinonim untuk (*a).b. Tanda kurung di sini diperlukan karena kekuatan pengikatan operator *dan .: *a.btidak akan berfungsi karena .pengikatan lebih kuat dan dieksekusi terlebih dahulu. Jadi ini setara dengan *(a.b).

Waspadalah terhadap overloading, meskipun: Karena keduanya ->dan *bisa jadi overload, artinya bisa berbeda secara drastis.


1
Dengan binding strengthmaksudmu operator didahulukan? jika tidak apa perbedaan antara keduanya?
vishnuprasanth

1
@Vizkrig Ya, kedua istilah tersebut digunakan secara bergantian (meskipun "prioritas operator" tampaknya jauh lebih sering, setidaknya dalam beberapa tahun terakhir).
Konrad Rudolph

45

Bahasa C ++ - mendefinisikan operator panah ( ->) sebagai sinonim untuk mendereferensi penunjuk dan kemudian menggunakan .-operator pada alamat itu.

Sebagai contoh:

Jika Anda memiliki objek itu, anObjectdan pointer, aPointer:

SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;

Untuk dapat menggunakan salah satu metode objek, Anda mendereferensi penunjuk dan melakukan panggilan metode pada alamat itu:

(*aPointer).method();

Yang bisa ditulis dengan operator panah:

aPointer->method();

Alasan utama keberadaan operator panah adalah bahwa itu mempersingkat pengetikan tugas yang sangat umum dan juga agak mudah untuk melupakan tanda kurung di sekitar dereferensi penunjuk. Jika Anda lupa tanda kurung.-Operator akan mengikat lebih kuat dari * -operator dan membuat contoh kita dieksekusi sebagai:

*(aPointer.method()); // Not our intention!

Beberapa dari jawaban lain juga menyebutkan bahwa operator C ++ bisa kelebihan beban dan itu tidak umum.


8
new SomeClass()mengembalikan pointer ( SomeClass *), bukan SomeClassobjek. Dan Anda mulai dengan mendeklarasikan anObjectdan aPointertetapi Anda menggunakan psesudahnya.
musiphil

Secara keseluruhan penjelasan ini secara teoritis sangat tepat, hanya perubahan objek yang membuatnya sedikit berbelit-belit. Tapi prosesnya lebih baik dijelaskan
Code Man

17

Dalam C ++ 0x, operator mendapatkan arti kedua, yang menunjukkan tipe kembalian dari sebuah fungsi atau ekspresi lambda

auto f() -> int; // "->" means "returns ..."

1
Secara teknis menandainya bukan lagi "operator" di sana, atau bukan?
Martin Ba

6
@Martin kebanyakan orang menggunakan kata "operator" untuk banyak hal yang tidak langsung digunakan untuk menghitung nilai. Seperti untuk "::" ("operator cakupan"). Saya tidak tahu persis apa sudut pandang standar tentang ini. Dalam arti abstrak, seseorang dapat melihat "->" sebagai operator fungsional yang memetakan urutan tipe (parameter) ke tipe kembalian, seperti operator haskell, yang juga ditulis "->".
Johannes Schaub - litb

6
Saya menyerah! :-P
Martin Ba

2
@ JohannesSchaub-litb: ::sebenarnya adalah operator, seperti .atau ->, dan disebut "operator resolusi cakupan" dalam standar.
musiphil

13

Saya kebanyakan membacanya dari kanan ke kiri dan menyebut "masuk"

foo->bar->baz = qux->croak

menjadi:

"baz di bar di foo menjadi parau di qux."


1

-> digunakan saat mengakses data yang penunjuknya Anda miliki.

Misalnya, Anda bisa membuat pointer ptr ke variabel bertipe int intVar seperti ini:

int* prt = &intVar;

Anda kemudian dapat menggunakan fungsi, seperti foo, di atasnya hanya dengan mendereferensi penunjuk itu - untuk memanggil fungsi pada variabel yang ditunjuk penunjuk, bukan pada nilai numerik dari lokasi memori variabel itu:

(*ptr).foo();

Tanpa tanda kurung di sini, kompilator akan memahami hal ini *(ptr.foo())karena prioritas operator bukan yang kita inginkan.

Ini sebenarnya sama saja dengan mengetik

ptr->foo();

Sebagai ->dereferensi penunjuk itu, dan karenanya memanggil fungsi foo()pada variabel yang ditunjuk penunjuk untuk kita.

Demikian pula, kita dapat menggunakan ->untuk mengakses atau mengatur anggota kelas:

myClass* ptr = &myClassMember;
ptr->myClassVar = 2; 

0

Anda dapat menggunakan -> untuk menentukan fungsi.

auto fun() -> int
{
return 100;
}

Ini bukan lambda. Ini benar-benar sebuah fungsi. "->" menunjukkan jenis kembalian dari fungsi tersebut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.