postfix a++
とprefixの2つの異なる方法でoperator ++をオーバーロードする方法は++a
?
postfix a++
とprefixの2つの異なる方法でoperator ++をオーバーロードする方法は++a
?
回答:
次のようになります。
class Number
{
public:
Number& operator++ () // prefix ++
{
// Do work on this. (increment your object here)
return *this;
}
// You want to make the ++ operator work like the standard operators
// The simple way to do this is to implement postfix in terms of prefix.
//
Number operator++ (int) // postfix ++
{
Number result(*this); // make a copy for result
++(*this); // Now use the prefix version to do the work
return result; // return the copy (the old) value.
}
};
Number operator++ (int)
、なぜをint
パラメーターとして取るのですか?
++x
はプレフィックスであり、したがってコールされますがoperator++()
、x++
はポストフィックスであり、コールされますoperator++(int)
違いは、のオーバーロードに対して選択する署名にありますoperator ++
。
C ++ FAQのこの主題に関する関連記事から引用(詳細はこちらを参照):
class Number { public: Number& operator++ (); // prefix ++: no parameter, returns a reference Number operator++ (int); // postfix ++: dummy parameter, returns a value };
PS:これについて知ったとき、最初に見たのはダミーパラメータだけでしたが、実際にはさまざまな戻り値の型の方が興味深いものです。彼らはなぜ一般++x
よりも効率的であると考えられるかを説明するかもしれません。x++
タイプTの2つの(前置/後置)++演算子をオーバーロードする方法は2つあります。
これは、「一般的な」OOPイディオムを使用する最も簡単な方法です。
class T
{
public :
T & operator++() // ++A
{
// Do increment of "this" value
return *this ;
}
T operator++(int) // A++
{
T temp = *this ;
// Do increment of "this" value
return temp ;
}
} ;
これはもう1つの方法です。関数が参照しているオブジェクトと同じ名前空間にある限り、コンパイラが処理++t ;
またはt++ ;
コーディングする機能を検索するときに、これらの機能が考慮されます。
class T
{
// etc.
} ;
T & operator++(T & p_oRight) // ++A
{
// Do increment of p_oRight value
return p_oRight ;
}
T operator++(T & p_oRight, int) // A++
{
T oCopy ;
// Copy p_oRight into oCopy
// Do increment of p_oRight value
return oCopy ;
}
C ++の観点(C ++コンパイラの観点を含む)から見ると、これらの非メンバー関数は(同じ名前空間にある限り)Tのインターフェイスの一部であることに注意してください。
非メンバー関数表記には2つの潜在的な利点があります。
遅いことはわかっていますが、同じ問題があり、より簡単な解決策が見つかりました。誤解しないでください。これは(Martin Yorkが投稿した)一番上のソリューションと同じです。それは少し簡単です。ちょっとだけ。ここにあります:
class Number
{
public:
/*prefix*/
Number& operator++ ()
{
/*Do stuff */
return *this;
}
/*postfix*/
Number& operator++ (int)
{
++(*this); //using the prefix operator from before
return *this;
}
};
上記のソリューションは、postfixメソッドで一時オブジェクトを使用しないため、少し単純です。