5
class compl{
    float re,im;

public:
    compl(float r, float i)
        {re=r; im=i;}
    compl& operator++()
        {++re; return*this;} //(1)
    compl operator++(int k){
        compl z=*this; re++; im+=k; return z;} //(2)
    friend compl& operator--(compl& z)
        {--z.re; return z;}
    friend compl operator--(compl& z,int k)
        {compl x=z; z.re--; z.im-=k; return x;}
};

(1) なぜ参照によって現在のオブジェクトを返さなければならないのですか? 私が理解したように、参照は何かの単なる 2 番目の名前です。

(2) 現在のオブジェクトを z に保存してから、オブジェクトを変更し、変更されていない z を返す必要があるのはなぜですか? これを行うと、増加されていない値が返されます。後置演算子の仕組みのせいですか(古い値を返し、それを増やします)

4

3 に答える 3

2

(1) する必要はありませんが、演算子または呼び出しを連鎖できるため慣用的です。

(2) はい、postfix は以前の値を返す必要があります。

于 2015-04-29T12:38:04.353 に答える
0

1- 演算子 ++ のオーバーロードは参照によって返される必要がありますが、変数のエイリアスが必要ない場合は、next と呼ばれる関数などを同じ構造で追加できます。

2-はい、現在の値を返し、変数をインクリメントする必要があるためです。

于 2015-04-29T13:05:24.520 に答える
-2

(1) ++ も値を返すようにしたいため、次のように

a = b++;

コピーを返却するよりも費用がかかりません。

(2) はい、後置演算子の働き方です。これは、プレフィックスのインクリメントを使用してイテレータでループを記述することが一般的に推奨される理由を説明しています

for(iterator it = ..... ; it != .... , ++it) { ...}

後置インクリメントの代わりに: 一時コピーの作成を回避します。

于 2015-04-29T12:43:39.557 に答える