4

私が同僚によって書かれたコードを通り抜けるとき、特定の場所で、彼らは以下を使用します:

this->doSomething(); //-->case A
doSomething(); //-->case B

実際、*このポインタの優れた使用法についてはよくわかりません... :(

引数の一致に関する別の質問:

obj.doOperation();  //-->case C
(&obj)->doOperation(); //-->case D

実際、どちらの場合も目的の操作を実行していますが、それは単にコードをより複雑に見せるための方法ですか?

上記の2つの質問に対するあなたの推奨事項は何ですか?それらを使用する適切な時期とその理由はいつですか?

4

3 に答える 3

5

これはあなたの質問に対する答えではありませんが、両方のフラグメントが異なることをする可能性があることに注意してください。

namespace B { void doSomething() {} }

struct A {    
    void f()
    {
        using B::doSomething;
        this->doSomething(); // call A::doSomething
        doSomething(); // calls B::doSomething
    }

    int a;
    void g(int a)
    {
        this->a = a; // assigns argument to member
    }

    A* operator & () { return this; }
    void doOperation() {}
    void doSomething() {}
};

void g(A &obj)
{
    obj.doOperation();  // calls A::doOperation directly
    (&obj)->doOperation(); // calls A::operator & first
}
于 2010-09-29T15:41:35.477 に答える
3

ケースBとCは常に適切な方法です。ケースAとDは同等であり、何も変わりません。

それに対するいくつかの例外:

  • クラスにoperator&驚くべきことを行うオーバーロードがある場合、ケースDはCとは異なることを行う可能性があります。混乱を招くため、実際にこれを行うクラスを使用することはお勧めしません。
  • ローカル変数doSomething(またはローカルスコープにその名前の他の何か)がある場合、AはdoSomethingBとは異なるものを参照します。このような状況に陥ることはお勧めしません。別のものに別の名前を付けることをお勧めします。 。
于 2010-09-29T15:47:34.557 に答える
1

CとDは異なります。が仮想の場合doOperation、ケースDは仮想呼び出しを実行し、ケースCはobj参照でない場合は非仮想呼び出しを実行します。operator&ただし、これは、およびが過負荷になっていないことを前提としoperator->ています。

doSomethingローカル識別子があるかもしれないので、私はBよりもAを使う傾向があります。テンプレートコード内では、状況が悪化する可能性があります(ただし、現時点では正確な例を示すことはできません)。取るのは良い習慣です。

于 2010-09-29T15:59:20.673 に答える