3

The C++ Programming Language Stroustrup では、inc/dec オーバーロードの次の例を示しています。

class Ptr_to_T {
    T* p;
    T* array ;
    int size;
public:
    Ptr_to_T(T* p, T* v, int s); // bind to array v of size s, initial value p
    Ptr_to_T(T* p); // bind to single object, initial value p
    Ptr_to_T& operator++(); // prefix
    Ptr_to_T operator++(int); // postfix
    Ptr_to_T& operator--(); // prefix
    Ptr_to_T operator--(int); // postfix
    T&operator*() ; // prefix
}

前置演算子は参照によって返されるのに、後置演算子は値によって返されるのはなぜですか?

ありがとう。

4

3 に答える 3

17

後置演算子は、インクリメントされる前の値のコピーを返すため、一時的な値を返す必要があります。前置演算子はオブジェクトの現在の値を返すため、現在の値への参照を返すことができます。

于 2009-01-21T14:34:19.650 に答える
8

理解を深めるには、これらの演算子がどのように実装されているかを想像(または確認)する必要があります。通常、プレフィックスoperator++は多かれ少なかれ次のように記述されます。

MyType& operator++()
{
    // do the incrementation
    return *this;
}

this「インプレース」で変更されているため、無駄なコピーを回避するために、インスタンスへの参照を返すことができます。

さて、これが接尾辞演算子++のコードです:

MyType operator++(int)
{
    MyType tmp(*this); // create a copy of 'this'
    ++(*this); // use the prefix operator to perform the increment
    return tmp; // return the temporary
}

postfix演算子は一時的なものを返すため、値で返す必要があります(そうしないと、ぶら下がっている参照を取得します)。

C ++ Faq Liteにも、この件に関する段落があります。

于 2009-01-21T14:48:02.057 に答える
0

オーバーロードされたプリインクリメントを使用してプライベートメンバーをインクリメントするとします。プライベートメンバーへの参照を返すと、++ private_var式が左辺値に変わり、プライベートメンバーを直接変更できるようになりませんか?

于 2009-01-21T15:07:47.727 に答える