2

私はJavaのバックグラウンドから来てC ++を学んでいます(何年も前からCを少し知っています)...

Java では、コンストラクター内で "this" を使用して、コンストラクターに引数として渡された変数と、クラスで宣言された変数を区別するのが一般的です。

class Blabla {

    private int a;
    private int b;

    Blabla(int a, int b){
        this.a = a;
        this.b = b;
    }
}

変数 Blabla.a と、コンストラクターに引数として渡された変数が同じものを表しているため、同じ名前にする必要があると論理的に感じられるため、私はこれが気に入っています...

C++でこれを行うことは可能ですか?

4

4 に答える 4

6

はい、を使用thisしてメンバー変数を参照できます。そうは言っても、慣用的なC++ではコードが次のように見えることがよくあります。

class Blabla {
  private:
    int a_;
    int b_;

  public:
    Blabla(int a, int b) : a_(a), b_(b) {}
};

ご覧のとおり、通常、アクセス制御指定子(、、publicまたはprotectedprivateを各メンバーに適用するのではなく、セクションにグループ化します。

また、上記で使用したタイプの初期化を使用する場合、メンバーは2回初期化されます。1回目はオブジェクトの作成時(基本的には中括弧内のコードが実行される前)のデフォルトコンストラクターで、2回目は割り当て中です。にthis->a

于 2009-12-09T18:08:45.873 に答える
4

はい、使用しますthis->a = a;

また、C++ では、コンストラクターで初期化リストを使用する必要があることに注意してください。

class Blab 
{
    public:
        Blab(int a, int b)
           :m_a(a),
            m_b(b)
        {
        }

    private:
        int m_a;
        int m_b;
};

編集:

:a(a), b(b)データメンバー a とコンストラクターに渡されるパラメーター a の両方に同じ名前を使用して、初期化リストで使用できます。異なる必要はありませんが、メンバー変数名に異なる命名規則を使用する方が良いと感じる人もいます。上記の例では、初期化リストが実際に何を行っていて、どのように使用されているかを明確にするために、さまざまな名前を使用しました。this->a必要に応じて、別のメンバー変数を設定するために使用できます。たとえば、メンバー変数とパラメーター変数の両方が a と b の場合、

class MyClass
{
    public:
        MyClass(int a, int b);
    private:
        int a;
        int b;
};

// Some valid init lists for the MyClass Constructor would be
:a(a), b(b)       // Init member a with param a and member b with parameter b
:a(a), b(this->a) // Init member a with param a and init member b with member a (ignores param b)
:a(5), b(25)      // Init member a with 5 and init member b with 25 (ignoring both params)

初期化リストは、クラス定義に現れるのと同じ順序でメンバー変数を初期化する必要があることに注意してください。優れたコンパイラは、そうでない場合に警告を出します。

于 2009-12-09T18:03:00.377 に答える
1

C ++ではthisポインタであるため、を使用してそのメンバー変数にアクセスしますthis->var

C ++はJavaとは異なる規則を持つ傾向が_varあり、通常のJavaの方法の代わりにプライベート変数に使用するのが一般的であることに注意してくださいthis.var。もちろん、それはあなたが使いたい慣習に依存します。

于 2009-12-09T18:05:12.920 に答える
0

要約して1つの答えにまとめるだけです。

this->a メソッドを使用する場合は、次のようになります。

class Blabla 
{
    private:
        int a;
        int b;

    public:
        Blabla(int a, int b);
}

Blabla::Blabla(int a, int b)
{
    this->a = a;
    this->b = b;
}

または、C++ の方法で :a(a) を使用すると、次のようになります。

class Blabla 
{
    private:
        int a;
        int b;

    public:
        Blabla(int a, int b);
}

Blabla::Blabla(int a, int b):a(a), b(b)
{
}

そして、個人的には、m_a やより c スタイルの _a のように文字を前に置くハンガリー表記の例よりも、this->a の方が読みやすいコードにつながると思います。

于 2012-09-15T09:05:13.913 に答える