Yanıtlar:
Aşağıdaki iki ifade eşdeğerdir:
a->b
(*a).b
(Konrad'ın bahsettiği gibi, operatörün aşırı yüklenmesine bağlıdır, ancak bu alışılmadık bir durumdur)
a[0].byerine de yapabilirsiniz (*a).b. Ama o kadar düzgün yapılandırılmamış.
a->bgenellikle eşanlamlıdır (*a).b. Buradaki parantezler, operatörlerin bağlanma gücü nedeniyle gereklidir *ve .: *a.bçalışmaz çünkü .daha güçlü bağlanır ve ilk olarak çalıştırılır. Bu, dolayısıyla eşdeğerdir *(a.b).
Yine de aşırı yüklemeye dikkat edin: Hem ->ve hem *de aşırı yüklenebildiğinden, anlamları büyük ölçüde farklılık gösterebilir.
binding strengthEğer operatör öncelik demek? değilse ikisi arasındaki fark nedir?
C ++ dili, ok operatörünü ( ->) bir işaretçinin .başvurusunu kaldırmanın eşanlamlısı olarak tanımlar ve sonra bu adreste -operatörü kullanır .
Örneğin:
Bir nesneniz anObjectve işaretçiniz varsa aPointer:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
İşaretçiye başvurduğunuz nesne yöntemlerinden birini kullanabilmek ve bu adreste bir yöntem çağrısı yapmak için:
(*aPointer).method();
Ok operatörü ile yazılabilir:
aPointer->method();
Ok operatörünün var olmasının temel nedeni, çok yaygın bir görevin yazımını kısaltması ve aynı zamanda işaretçinin referansını kaldırmanın etrafındaki parantezleri unutmanın bir nevi kolay olmasıdır. Parantezleri unuttuysanız,.-Operatörü * -operator'dan daha güçlü bağlanır ve örneğimizin şu şekilde yürütülmesini sağlar:
*(aPointer.method()); // Not our intention!
Diğer yanıtlardan bazıları, hem C ++ operatörlerinin aşırı yüklenebileceğinden hem de bu kadar yaygın olmadığından bahsetmiştir.
new SomeClass()nesne SomeClass *değil bir işaretçi ( ) döndürür SomeClass. Ve bildirerek ile başlar anObjectve aPointerancak kullandığınız psonradan.
C ++ 0x'de, operatör, bir işlevin veya lambda ifadesinin dönüş türünü gösteren ikinci bir anlam alır.
auto f() -> int; // "->" means "returns ..."
::aslında .veya gibi bir operatördür ->ve standartta "kapsam çözümleme operatörü" olarak adlandırılır.
-> bir işaretçinizin olduğu verilere erişirken kullanılır.
Örneğin, intVar türünde bir değişkene ptr işaretçisi şu şekilde oluşturabilirsiniz:
int* prt = &intVar;
Daha sonra foo gibi bir işlevi, yalnızca o işaretçiyi referans alarak kaldırarak kullanabilirsiniz - işlevi, o değişkenin bellek konumunun sayısal değeri yerine işaretçinin işaret ettiği değişken üzerinde çağırmak için:
(*ptr).foo();
Buradaki parantezler olmadan, derleyici bunu şu şekilde anlayacaktır: *(ptr.foo()) istediğimiz şey olmayan operatör önceliğine bağlı .
Bu aslında yazmakla aynı
ptr->foo();
Şöyle ->dereferences işaretçi ve böylece işlevini çağırırfoo() işaretçi bizim için işaret ettiği değişkeni.
Benzer şekilde, ->bir sınıfın üyesine erişmek veya ayarlamak için kullanabiliriz :
myClass* ptr = &myClassMember;
ptr->myClassVar = 2;
->bazı yineleyici türleri için aşırı yüklenmiş operatörü yoktu , bu yüzden kullanmanız gerekiyordu*.. Birçok kütüphane bunları tutarsız olarak tanımlar. Şablonlarla çalışırken ve kesin türü bilmediğinizde gerçekten can sıkıcı hale geliyor.