ページ 11

後置式演算子のオーバーロードについて

Posted: 2011年8月06日(土) 20:26
by MoNoQLoREATOR
http://www.geocities.jp/ky_webid/cpp/language/017.html
上記の解説サイトの下の方に前置式・後置式 演算子のオーバーロードについての下記のような解説が書かれています。

コード:

class CData{
public:
	CData& operator++();    // 前置
	CData operator++(int);  // 後置(引数の int は後置式であることを示すダミー)
private:
	int m_data;
};

CData& CData::operator++()
{
	// 前置式なので、インクリメントを行ってから return
	m_data += 1;
	return *this;
}

CData CData::operator++(int)
{
	// 後置式なので、古い状態をローカル変数にコピーしておき、インクリメントする。
	// その後で、古い方を返す。
	CData tmp = *this;
	m_data += 1;
	return tmp;
}
なぜ後置式の場合は古いデータを返さなければならないのでしょうか?

Re: 後置式演算子のオーバーロードについて

Posted: 2011年8月06日(土) 21:15
by YuO
MoNoQLoREATOR さんが書きました:なぜ後置式の場合は古いデータを返さなければならないのでしょうか?
必ずしも古いデータを返す必要はありません。
が,演算子のオーバーロード時に演算子の意味を変えることは,普通は行いません。
# iostreamの<<や>>はしばしば批判の対象になります。

組み込み型では

コード:

int n = 10;
int n1 = n++; // n1 は 10, nは11
int n2 = ++n; // n2 は 12, nは12
のように動作するので,それに則って後置した場合は古いデータを返すことが多いです。

Re: 後置式演算子のオーバーロードについて

Posted: 2011年8月06日(土) 21:16
by みけCAT
C言語の後置インクリメントがそういう仕様だからです。
たとえば、このコードを実行してみるとわかります。

コード:

#include <stdio.h>
 
int main(void) {
        int a,b;
        a=5;
        b=5;
        printf("++a==%d\n",++a);
        printf("b++==%d\n",b++);
        return 0;
}
実行結果はこうなります。

コード:

++a==6
b++==5
http://ideone.com/xpp15

Re: 後置式演算子のオーバーロードについて

Posted: 2011年8月07日(日) 06:58
by MoNoQLoREATOR
そんな仕様になっていたとは、初めて知りました。
もしかしたら今までのバグもそれが原因かも・・・。

回答ありがとうございました。