2016-04-01 9 views
1

I just learned olarak, bir işaretçi p için, başvurulan nesnenin bir üyesine, yani p->foo ve (*p).foo erişim için iki eşdeğer yolu vardır.C++ 'daki işaretçi üyelerine erişmek için nokta (.) Veya ok (->) operatörünü tercih etmeliyim?

Kullanılacak teknik argümanlar var mı?

Not: Ben okumak Bir argüman, bu aşırı edilemez çünkü -> kutu ise ., daha güvenli olmasıdır. Ancak, daha fazla argüman olmalı, çünkü çalışıyorum çoğu C++ kodunda ben sadece -> -construct görüyorum.

+2

'*' ayrıca aşırı yüklenebilir. –

+2

Okuduğunuz her şeye inanmayın. İyi olacaksın. –

+1

bu bir soru, gerçek bir cevap yok. Sadece kodlamaya devam edin ve kendiniz için karar verin. – Laurijssen

cevap

5

Ham işaretçiler için, operatörler aşırı yüklenemez.

Akıllı göstericiler için operator * da aşırı yüklenebilir ve aynı nesneyi operator -> (yönlendirilmemiş olsa da) olarak döndürmelidir.

operator -> IMO, her şeyi parantez içinde sarmaktan çok daha iyi okunabilir, özellikle de arka arkaya çok kez kullandığınızda.

Orada operator * ise operator -> zincirli olması hafif bir fark (operator -> döndürülen nesne üzerinde denir ve tekrar aşırı yüklenebilir) değil ama bu farklı sonuçlarda son verecek bir durum var sıra dışıdır. Eğer özel bir davranışı elde etmek operatörleri aşırı durumlar hariç

p->member 
(*p).member 

:

0

Genellikle her iki yaklaşım da aynı şeyi yaparlar.

'Daha iyi' olana göre, daha iyi olanlara bağlıdır ... p->member çok daha temizdir ve kodun anlaşılmasını kolaylaştırır, bu her zaman büyük bir artıdır.

hem temp0 ve temp1
struct NewType 
{ 
    int data; 
} 

void foo (NewType **p) 
{ 
    int temp0 = (*p)->data; 
    int temp1 = (*(*p)).data; 
} 

aynı değere sahip, ancak temp0 için neler olup bittiğini görmek için çok daha kolay:

daha karmaşık bir örneğini ele alalım.

İlgili konular