2017-01-12 18 views
22

Bunun neden çalışmadığını anlayamıyorum. Her zaman 'bu' işaretçisini kurucunun içinde kullanabileceğimi düşündüm, ancak başlatma listesindeki 'bunu' kullanamayacağımı asla bilemedim.Kurucunun başlangıç ​​listesinde 'bu' işareti

#include <iostream> 

class A { 
    public: 
     int a; 
     int b; 
     A(int a = 0, int b = 0) : this->a(a), this->b(b) { } 
     void print() { 
     std::cout << a << ", " << b << std::endl; 
    } 
}; 

int main() { 
    A a; 
    a.print(); 
} 

Onunla ilgili ayrıntıları bilmek istiyorum.

+0

"Dil avukatını" etiketledim: Cevabımın doğru olduğuna ikna olmadım. – Bathsheba

+2

Kurucunun gövdesinde değilsiniz, ancak kurucunun başlatıcı listesinde bulunuyorsunuz. –

+2

@DavidSchwartz 'b (this-> a)' sadece iyi olurdu. – Potatoswatter

cevap

28

gerek yoktur, çünkü onun sözdizimi sıkı olduğu için Basitçe, bir başlatıcı listesi zaten sorun aşılabilir: Sadece gerçekten zaman kullanılır

A(int a = 0, int b = 0) : a(a), b(b) {} 

this->member:

member(value) 

Yani sadece olarak değiştirebilirsiniz programlayıcının, örneğin kurucunuzun şu gibi görünmesi için derleyiciye yardımcı olması gerekir:

A(int a = 0, int b = 0) 
{ 
    // set local 'a' to itself 
    a = a; 
} 

A::a şimdi başlatılamadı, oops!

Sen derleyici yardımcı olmak this gerekir: Bir üye erişim ifadesidir, ama sadece bir tanımlayıcı vardır izin verilir çünkü

A(int a = 0, int b = 0) 
{ 
    this->a = a; // set A::a to local a. 
} 
+0

Belirsizlik olduğunda bir konuya daha çok bir Java meselesi olduğunda üyelere erişmek için 'this' i kullanarak eklemek istiyorum. C++ 'da, özniteliklerinizin (genellikle) "a_" gibi bir isme sahip olması gerekir, bu da yukarıdaki satırı "a_ = a;" olarak azaltır. [Google C++ Stili Kılavuzu] 'nu (https://google.github.io/styleguide/cppguide.html#Variable_Names) alıntılamak için: _Data sınıflarının üyeleri (ancak yapıları değil) ek olarak alt çizgi işaretleri var – Konstantin

+10

@ Konstantin .: Not Google C++ Stil Kılavuzu'nun C++ programcıları arasında pek saygın olmadığı ve C++ topluluğunun önerdiği şeyin temsilcisi olarak ele alınmaması gerektiği. – ruakh

+0

@ KonstantinĐ. Önek/sonek adlandırma kurallarının değeri çok özneldir ve çoğu zaman gereksizdir. Bu yüzden bu “yapı” ilk etapta var. Temiz kod Bob Martin tarafından farklı bir bakış açısı için tavsiye ederim. – drognisep

25

this->a dilbilgisi geçersiz (veya tür belirteci, temel sınıfları için) . C++ standart [class.base.init] kaynaktan

,

Mem-başlatıcı-id:
sınıf ya da decltype
tanımlayıcı

+3

Doğru, ve "neden" ... çünkü eklenmiş bir 'bu->' için dilbilgisini karmaşıklaştırmaya kesinlikle gerek yoktur. Aslında, daha sonra sadece eklediğin _but_ eklediğin bir şeyi yasaklamak için "... kötü biçimli" kurallarla bir araya gelmek zorunda kalacaksın. –

İlgili konular