Performansta - veya başka türlü - - arasında herhangi bir fark var mı:C++ - (*) arasındaki fark. ve ->?
ptr->a();
ve
(*ptr).a();
?
Performansta - veya başka türlü - - arasında herhangi bir fark var mı:C++ - (*) arasındaki fark. ve ->?
ptr->a();
ve
(*ptr).a();
?
Sizden yorumda bulunduğunuz için. Ne muhtemelen Standard bulunabilir Aradığınız (5.2.5 Sınıf üye erişimi):
E1 tipi varsa3 “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.
[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.
-> ve * kendileri T türünde değil, bir işaretçi olan T * türünde çalışmazlar. –
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ış. –
@Brian '->' ve '*' operatör-> ve 'operatör *'yi tanımlayan her şey üzerinde çalışır. * Ve * tüm işaretçi türlerinde de. –
->
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
@Jeremy: Yıldız işaretlerini biçimlendirme komutları olarak yorumlanmayacak şekilde durdurmak için bir dizi geri adım ekledim :). –
@Andrew: teşekkürler! –
Yep. Aradığım şey, aynı altta olup olmadıkları. – Rachel