3

C ++で「this」を使用しないのではなく、クラスメンバーを参照するために「this」を使用することには、何らかの利点があるのではないかと思っていましたか?

例えば...

class Test
{
    public:
        Test();
        void print_test()
            {
                std::cout << this -> m_x   // Using 'this'
                          << endl;

                std::cout << m_x          // Rather than referencing 'm_x' this way
                          << endl;
            }
    private:
        int m_x;
        int m_y;
};
4

4 に答える 4

5

いいえ、パフォーマンスの違いはありません。コンパイラにとって、意味は同じです。

ええと、ほぼ...具体的に言う必要がthisあるのは、メンバー変数をシャドウする内部スコープに同じ名前の変数がある場合(とにかく悪い形式と見なされます)、またはテンプレート化された名前が基底クラスのメンバーを参照していることをコンパイラに伝える必要があります (これは非常にまれです)。

于 2013-11-18T06:32:12.397 に答える
2

時にはそれは単なるコンベンションです。

基本的な考え方は、通常、this->名前の競合を避けるために使用する必要があるということです:

class Value
{
public:
    Value(): value(0), valueSet(false) {}

    void setValue(int value) {
        //value = value; ( WRONG : Naming conflict )
        this->value = value; // Use this-> to distinguish between them
        valueSet = true;
    }

private:
    int value;
    bool valueSet;
}

valueSet = true;なしのステートメントthis->は醜く見えます。そのため、人々this->はすべてのものに一貫性を持たせるために接頭辞を付けることを好みます:

    void setValue(int value) {
        this->value = value;
        this->valueSet = true; // Isn't this consistent and beautiful?
    }

しかし、C++ に関する私の知識では、このパターンは広く使用されていません。Javaソース コードを見たことがあれば、this.メンバー フィールド アクセスの前にプレフィックスを付けるのは非常に一般的です。

PS: 別の理由として考えられるのは、単にそれがメンバー フィールドであることを強調したいだけであって、それ以外のものではないということです。ほとんどの単純なエディターはそのようなフィールドを強調表示できないため、コードの読みやすさを向上させることができます。

于 2013-11-18T08:57:38.387 に答える
0

使用しない場合は、それが暗示されます。したがって、これらの 2 つの書き込みは、コンパイラがthis.

発生する可能性のある唯一の問題は、変数名があいまいであることです。しかし、接頭辞 (または接尾辞) メンバーの規則を使用している限り、m_or_mは安全です。

また、「this」ポインターを明示的に使用する必要があるのはいつですか?

于 2013-11-18T06:22:15.353 に答える
0

いいえ..そうでなければ、誰もがこのようなコードを書いていたでしょう。誰かが読みやすいと思ったのかもしれません。おそらく彼は Java 開発者だったのでしょう。

于 2013-11-18T06:26:07.453 に答える