Soru Kurucunun başlangıç ​​listesinde 'bu' işaretçisi


Bunun neden işe yaramadığı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.

#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 detayları bilmek istiyorum.


22
2018-01-12 14:19


Menşei


"Dil avukatını" etiketledim: Cevabımın doğru olduğuna ikna olmadım. - Bathsheba
Kurucunun gövdesinde değilsiniz, ancak kurucunun başlatıcı listesinde bulunuyorsunuz. - David Schwartz
@DavidSchwartz b(this->a) sadece iyi olurdu. - Potatoswatter


Cevaplar:


İhtiyacınız olmadığından, bir sözdizimi listesi zaten sözdizimi sıkı olduğundan, zaten anlaşılamıyor olabilir:

member(value)

Yani bunu sadece değiştirebilirsiniz:

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

this->member programlayıcının, örneğin kurucunuzun benzeyeceği gibi, derleyicinin çözülmesine yardımcı olması gerektiğinde gerçekten kullanılır.

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

Sizin A::a şimdi başlatılamazdı, oops!

İhtiyacın olur this derleyiciye yardımcı olmak için:

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

28
2018-01-12 14:22



Bunu kullanarak eklemek istiyorum this belirsizlik bir konu olduğunda üyelere erişmek için daha fazla bir Java şeydir. C ++’da, öznitelikleriniz (genellikle) a_Yukarıdaki satırı a_ = a;. Alıntı yapmak Google C ++ Stil Rehberi: Sınıfların veri üyeleri (yapıları değil) ek olarak alttan çizgilere sahiptir. - Konstantin
@ Konstantin .: Google C ++ Stil Rehberi'nin C ++ programcıları arasında pek saygın olmadığını ve C ++ topluluğunun önerdiği şeyin temsilcisi olarak ele alınmadığını unutmayın. - ruakh
@ KonstantinĐ. Önek / sonek adlandırma kurallarının değeri çok özneldir ve çoğu zaman gereksizdir. Bu yüzden this ilk etapta yapı vardır. Temiz kod Bob Martin tarafından farklı bir bakış açısı için tavsiye ederim. - drognisep


this->a dilbilgisel olarak geçersizdir, çünkü bir üye erişim ifadesidir, ancak yalnızca bir tanımlayıcıya izin verilir (veya temel sınıflar için bir tür belirtici).

C ++ standardından [class.base.init],

mem-başlatıcı-id:
   Sınıf ya decltype
   tanımlayıcı


25
2018-01-12 14:54



Doğru, ve "neden" ... çünkü eklenmesi için dilbilgisini zorlaştırmaya gerek yok. this->. Aslında, daha önce eklediğiniz herhangi bir şeyi yasaklamaya yönelik bir grup "kötü biçimli" kurallar ile geri dönmelisiniz. fakat ekledi this->. - Lightness Races in Orbit