2012-03-06 32 views
12

C++ sınıfındaki bir üye işlevinde, this->dataMember veya yalnızca dataMember kullanıyorsam fark eder mi? Daha iyi bir stil olarak kabul edilir? Performans farkı var mı? Bu sınıfta kullanmalı mıyım?

(Ben, bildiğim kadarıyla, bunları ayırt etmek this-> kullanmalıdır bu durumda yerel bir değişken veri üyesi olarak aynı ada sahip durumda, söz etmiyorum.)

cevap

4

basitçe gereksiz olduğunu Yerel üyeleri ve üyeleri arasında hızlı bir şekilde ayırmak istemediğiniz sürece, üyeleri aramak için this->'u kullanın. Birçok kişi, this-> her zaman yazmamak için sınıf üyeleri için m_ önekini kullanır.

1

kullanımı bu başka durumda bir gizli/özel üye =) olduğunda o = bir fark yaratmaz) IBM bilgi merkezinden

i kullanarak

Unless a class member name is hidden, using the class member name is equivalent to using 
the class member name with the this pointer and the class member access operator (->). 
1

aşağıdaki Alıntı " this-> "daha iyi (üyeler olduğunuzdan eminsiniz) ama bir fark yaratmıyor

0

Bir şablon işlevi, çağrının herhangi bir şablon parametresine bağlı olmaması için bir üye işlevini çağırıyorsa, this-> yardımcı olmak için kullanılabilir MyUtopicClass<int, double, double>::vin()'a alternatif olarak derleyici.

+2

Dikkat: eğer 'vin' sanal bir işlev ise, o zaman bu-> vin() 've' MyUtopicClass :: vin() 'farklıdır. – aschepler

6

Bu bir stil meselesidir. Bazı kullanıcılar, bir sınıf üyesine eriştiğinizi daha açık hale getirmek için fazladan this->'u beğenir. Ancak, o olmadan yeterince açık olduğunu düşünüyorsanız, üretilen kod veya performansta hiçbir fark olmayacaktır.

(bir tür bağımlı temel sınıf üyesi isim çalışırken örtüşen kapsamları ile belirtilen durumda yanı sıra, this-> da bir şablona zorunlu olabilir.) Genel bir kural olarak

19

, bu bir soru yerel sözleşmeler. Gördüğüm yerlerinin çoğu, this->'u gerektiği zaman kullanmazlar, ve bu da benim tercih ettiğim kongre olan , ama ben 'u sistematik olarak kullanmayı tercih eden kullanıcıları duydum.

Gerekli olduğunda iki durum vardır. Birincisi, 'u gizlediyseniz, yerel adla aynı ada sahip olan ismi; eğer ör. toto isimli bir üyeniz var ve ayrıca işlev argümanınızı toto olarak adlandırdınız. Birçok kodlama kuralları, bu durumundan kaçınmak için üye veya argümanları işaretler, örn. Tüm üye adları my veya m_ ile başlar veya parametre adı the ile başlayacaktır.

Diğer bir örnek, adına bir ad vermek için şablonda this->'un kullanılabilmesidir. Bu, bir şablon sınıfının bağımlı tipinden miras alması ve tabanın bir üyesine, örneğin: Burada this-> olmadan

template <typename T> 
class Toto : public T 
{ 
public: 
    int f() 
    { 
     return this->g(); 
    } 
}; 

, g() olmayan bir bağımlı adı olurdu ve derleyici dikkate temel sınıfını almadan şablon tanımının, bağlamında o kadar olmazdı.

+0

Bu harika bir cevap, şablon vakasını dikkate almadım. – MadPumpkin

5

işlevleri numaralı telefonu arayarak her zaman this numaralı telefonu kullanırım.

  1. Bu işlev adını, temel sınıf üyesi işlevleri bir sınıf şablonunda bulunacak şekilde bağımlı bir ada göre döndürür.
  2. Bağımsız değişken aramaları bastırır. ADL'nin avantajları var, ama şaşırtıcı davranışlara yol açabilir ve yoluma çıkmazsa hoşuma gider.
  3. Gerçek dezavantajları yoktur ve bu yüzden tüm üye işlev çağrıları için tutarlılık nedenlerinden dolayı kullanırım.
  4. Python'da, açık bir self'un zorunlu olduğu bir yerde program yapıyorum, bu yüzden benim için gerçek bir yük değil.

Ancak veri üyeleri için yalnızca gerektiğinde kullanıyorum, çünkü hiçbir ADL olmadığından. Özel sorularınızı yanıtlamak için:

C++ 'da bir sınıfın bir üye işlevinde, bu-> dataMember'i veya yalnızca dataMember kullanırsam bir fark yaratır mı?

Evet, bu bir sınıf şablonunun içinde bulunuyorsa. Sonra dataMember, anlamsal farklılıklara yol açabilecek bağımlı olmayan bir isim olarak kabul edilir. Örneğin:

#include <iostream> 

int i = 1; 

struct R { 
    int i; 
    R(): i(2) { } 
}; 

template<typename T> 
struct S: T { 
    void f() { 
    std::cout << i << ' '  // selects ::i 
       << this->i  // selects R::i 
       << std::endl; 
    } 
}; 

int main() { 
    S<R>().f(); 
} 

daha iyi bir çözümdür ne olacak? Bu konuda topluluk içinde güçlü bir fikir olduğunu düşünmüyorum. Stilleri kullanın, ancak tutarlı olun.

Herhangi bir performans farkı var mı?

Eminim ki yoktur.

İlgili konular