2017-01-12 11 views
22

これはなぜ動作しないのか分かりません。私はいつもコンストラクタ内で 'this'ポインタを使うことができると思っていましたが、初期化リストで 'this'を使うことはできませんでした。コンストラクタの初期化リストの 'this'ポインタ

#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(); 
} 

私はそれに関連する詳細を知りたいと思っています。

+0

私は「言語弁護士」とタグ付けしました。私の答えは正しいとは確信していません。 – Bathsheba

+2

あなたはコンストラクタの本体の内部にいませんが、コンストラクタの初期化子リストにあります。 –

+2

@DavidSchwartz 'b(this-> a)'はうまくいくでしょう。 – Potatoswatter

答えて

28

必要はありませんので、その構文が厳格であるため、単純に、初期化子リストはすでに明確にすることができますだけは本当に際に使用されている

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

this->member

member(value) 

だからあなただけにそれを変更することができますプログラマは、コンストラクタが次のように見える場合など、コンパイラが曖昧さを解消するのを助ける必要があります。

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

A::aは初期化されていません。

あなたは、コンパイラを支援するthisが必要になります

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

あいまいさが問題であるときにメンバーにアクセスするために 'this'を使って追加したいのは、Javaのものです。 C++では、あなたの属性は(通常) 'a_'のような名前でなければなりません。これは上記の行を' a_ = a; 'に減らします。 [Google C++スタイルガイド](https://google.github.io/styleguide/cppguide.html#Variable_Names)を引用するには:クラスの構造体(ただし構造体ではない)のメンバーにはさらに末尾にアンダースコアがあります。 – Konstantin

+10

@コンスタンチンGoogle C++スタイルガイドはC++プログラマーの間ではあまり尊敬されていないので、C++コミュニティが推奨するものを代表するものではありません。 – ruakh

+0

@KonstantinĐ。接頭辞/接尾辞命名規則の価値は非常に主観的であり、しばしば不必要です。そういうわけで、最初に「this」コンストラクトが存在するのです。私は、ボブ・マーティンの別の見解でClean Codeをお勧めします。 – drognisep

25

this->aそれは、メンバーアクセス式であるため、文法的に無効であるが、唯一の識別子が(基底クラスのために、または型指定)が許可されています。

C++標準から、[class.base.init]、

MEM-イニシャライザ-ID:
クラスまたは-decltype
識別子

+3

右の "理由"は....です。なぜなら、追加された 'this-> 'を許可するために文法を複雑にする必要が全くないからです。実際には、追加された 'this->'を追加したばかりのものを基本的に禁止するために、一連の "... ill-formed"ルールでバックトラックする必要があります。 –

関連する問題