2010-03-18 27 views

cevap

12

Sizden yorumda bulunduğunuz için. Ne muhtemelen Standard bulunabilir Aradığınız (5.2.5 Sınıf üye erişimi):

E1 tipi varsa

3 “Sınıf X'e işaretçi,” o zaman ifade E1-> E2 olduğunu eşdeğer formuna dönüştürülmüş (* (E1)) E2;

Derleyici tam olarak aynı yönergeleri üretecek ve aynı derecede verimli olacaktır. Makineniz "->" veya "*." Yazıp yazmadığınızı bilmeyecektir.

+0

Yep. Aradığım şey, aynı altta olup olmadıkları. – Rachel

15

[Düzenleme] değişken (T bir tür olan) T * olarak tanımlanırsa

sonra her ikisi de -> ve * aynı (ptr boş değilse).

Değişken bir sınıf örneğiyse (değer veya başvuruyla), o zaman -> ve * aynı davranmalıdır (en iyi uygulama başına) ancak bu, sınıfın bunları aynı şekilde aşırı yüklemesini gerektirir.

+1

-> ve * kendileri T türünde değil, bir işaretçi olan T * türünde çalışmazlar. –

+8

Eğer altta yatan sınıf * * aşırı yüklenen * -> 'veya' * 'ise, her ikisi de aşırı yüklenmeli ve böylece hala aynı olmalıdır. Aksi takdirde kötü tasarlanmış. –

+0

@Brian '->' ve '*' operatör-> ve 'operatör *'yi tanımlayan her şey üzerinde çalışır. * Ve * tüm işaretçi türlerinde de. –

7

-> operatörü, çoğu durumda, ifadenin sonucu artık için aşırı yüklenmiş bir işleve sahip olmayan bir işleve sahip olana kadar yinelemeli olarak "delinir" özel bir özelliğe sahiptir. (*subxpression).x ifadesi yalnızca alt ifadenin üzerinde bir dereference yapar, böylece (*subexpression) sonucu başka gösterici ise, o zaman bu derlemek olmaz (eğer (*(*subexpression)).x yazmak için ihtiyaç duyduğu daha iyi anlaşılması için aşağıdaki kodu bakınız:.

#include <iostream> 
using namespace std; 

class MyClass 
{ 
public: 
    MyClass() : x(0) {} 
    int x; 
}; 

class MyPtr 
{ 
private: 
    MyClass* mObj; 
public: 
    MyPtr(MyClass* obj) : mObj(obj) {} 
    MyClass* operator->() 
    { 
     return mObj; 
    } 
}; 

int main() 
{ 
    MyClass obj; 
    MyClass* objCPtr = &obj; 
    MyClass** objCHandle = &objCPtr; 
    MyPtr ptr(&obj); 
    cout << ptr->x << endl; 
    cout << (*(*objCHandle)).x << endl; 
} 

Bu derleme olmaz, ancak Not:.

cout << objCHandle->x << endl; 

Çünkü matkap aşağı davranış -> ifadesinin sol tarafında bir sınıftır sadece oluşan yapı, sendika veya genel tür Bu durumda, objCHandle bir MyClass ** 'dır, bu yüzden uygun değil

+1

@Jeremy: Yıldız işaretlerini biçimlendirme komutları olarak yorumlanmayacak şekilde durdurmak için bir dizi geri adım ekledim :). –

+0

@Andrew: teşekkürler! –