'Bu' neden referans değil işaretçi?


183

Bu sorunun cevabını C ++ artıları ve eksileri okuyordum ve yorumları okurken bu şüphe var.

programcılar sık ​​sık "bu" bir işaretçi olduğunu, ancak bir referans değil kafa karıştırıcı buluyorum. başka bir karışıklık neden "merhaba" std :: string türünde değil, ancak char const * (pointer) (dizi-işaretçi dönüşüm sonra) değerlendirir - Johannes Schaub - litb 22 Aralık '1:56

Bu sadece diğer (sonraki) dillerle aynı kuralları kullanmadığını gösterir. - le dorfier 22 Aralık 08:35

Yine de "bu" şeye oldukça önemsiz bir konu diyebilirim. Hata! Tanımsız davranış örneklerimdeki birkaç hatayı yakaladığınız için teşekkürler. :) Her ne kadar ben boyutu hakkında ilk bilgi bir şey ile ilgisi olduğunu anlamıyorum. İşaretçinin ayrılan belleğin dışını göstermesine izin verilmiyor - jalf 22 Aralık 08: 04'te

Bu sürekli bir işaretçi mi? - yesraaj 22 Aralık 08:35

yöntem const int getFoo () const ise bu sabit olabilir; <- getFoo kapsamında "bu" sabittir ve bu nedenle salt okunurdur. Bu, hataları önler ve arayan kişiye nesnenin değişmeyeceğini garanti eder. - Doug T. 22 Aralık 08:42

"Bunu" yeniden atayamazsınız. yani "this = & other;" yapamazsınız, çünkü bu bir değerdir. ancak bu T tipi değildir, T türü değildir. yani sabit olmayan bir işaretçi. Eğer bir const yöntemindeyseniz, o zaman const için bir işaretçi. Tşş. ancak işaretçinin kendisi sabit değildir - Johannes Schaub - litb 22 Aralık 08: 17: 53

"this" ifadesini şöyle düşünün: #defile (this_ + 0), derleyicinin nesneye işaretçi olarak "this_" oluşturduğunu ve "this" ifadesini anahtar sözcük haline getirdiğini tanımlayın. "this" atayamazsınız çünkü (this_ + 0) bir değerdir. Tabii ki böyle değil (böyle bir makro yok), ama bunu anlamaya yardımcı olabilir - Johannes Schaub - litb 22 Aralık 08:55

Benim sorum, thisbir işaretçi neden bir referans değil? İşaretçi yapmak için özel bir neden var mı?


thisReferans olmanın neden mantıklı olacağına dair bazı argümanlar :

  • Düşünün Item 1dan More Effective C++ biz geçerli bir nesne değil yani NULL (benim yorumum) sahip olduğu garanti edildiğinde kullanıma referansları:.
  • Ayrıca, referanslar işaretçilerden daha güvenli kabul edilir (çünkü hafızayı başıboş bir işaretçi ile vidalayamayız).
  • Üçüncüsü, referanslara ( .) erişim sözdizimi, işaretçilere ( ->veya (*)) erişmekten biraz daha hoş ve kısadır .

5
@paulm Bu "hack" aslında ne başaracaktı? Her thiszaman için değerlendirme yapmıyor mu true?
iFreilicht

6
@paulm Bunun aslında C ++ olduğunu düşünmüyorum. Bir nullptr üzerindeki yöntemleri bir nesneye çağırmak, tanımsız davranışa neden olur.
antred

5
@paulm Belki bazı durumlarda işe yarar, ancak yöntemin virütal olup olmadığını düşünün. V-tablosu araması nesne olmadan nasıl yapılabilir?
Jason Creighton

3
@paulm Üretim kodunda gördüyseniz, gemiyi terk edin! Bu UB.
Alice

6
Bunu burada bırakacağım ... (MFC'den afxwin2.inl'den):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
Christopher Oicles

Yanıtlar:


176

Dil ilk geliştiğinde, gerçek kullanıcılarla erken sürümlerde, referanslar yoktu, sadece işaretçiler vardı. Operatörün aşırı yüklenmesi eklendiğinde referanslar eklendi, çünkü sürekli çalışmak için referanslar gerektiriyor.

Kullanımlarından biri, thisbir nesnenin kendisine bir işaretçi almasıdır. Bir referans olsaydı, yazmak zorundayız &this. Öte yandan, bir atama operatörü yazdığımızda return *this, daha basit görünen bir atama operatörü yazmamız gerekir return this. Yani eğer boş bir sayfanız varsa, her iki şekilde de tartışabilirsiniz. Ancak C ++, bir kullanıcı topluluğunun geri bildirimlerine yanıt olarak yavaş yavaş gelişti (en başarılı şeyler gibi). Geriye dönük uyumluluğun değeri, thisbir referans veya işaretçi olmaktan kaynaklanan küçük avantajları / dezavantajları tamamen boğar .


4
Ayrıca, bir nesnenin kendisine referans alması da genellikle yararlıdır. Bunun daha yaygın bir kullanım olduğunu söyleyebilirim. Her neyse, asıl sebep sizin söylediğiniz gibi, referanslar 'bu' işaretçiyi oluşturduklarında yoktu.
jalf

20
Ve bu bir referans olsaydı, operator &yararlı bir şey yapmak için aşırı yüklemek zor olurdu . Bunun adresini atlatmak için özel bir sözdizimi olmalı operator &.
şeye kadir

10
@conio - bir dahaki sefere bir C ++ derleyicisinin yakınında olduğunuzu kontrol etmek isteyebilirsiniz! :) Gibi bir şey:int n = 5; int &r = n; int *p = &r; std::cout << *p;
Daniel Earwicker

14
@Omnifarious &reinterpret_cast<char&>(this);aşırı yükleme için gerçek adresi almak için yazabilirsiniz operator&(aslında, bu ne boost::addressofyapar).
Johannes Schaub - litb

9
thisBoş olması gerçekten bir anlam ifade etmediğinden , bana göre bir referans gerçekten daha uygun.
Ponkadoodle

114

Partiye biraz geç ... Atın ağzından, Bjarne Stroustrup'un söyleyecekleri (aslında "C ++ Tasarım ve Evrimi" kitabında tekrarlanan veya alınan):

" this" Neden referans değil?

Çünkü "this" referanslar eklenmeden önce C ++ 'a (gerçekten de Class'larla C'ye) sokuldu. Ayrıca, this"benlik" Smalltalk kullanımı yerine, Simula kullanımını takip etmek için " " seçeneğini seçtim .


2
Evet, benlik diğer dillerle tutarlılık için iyi olurdu, oh iyi.
pilkch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.