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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

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

#1

投稿記事 by MoNoQLoREATOR » 14年前

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;
}
なぜ後置式の場合は古いデータを返さなければならないのでしょうか?

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

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

#2

投稿記事 by YuO » 14年前

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

組み込み型では

コード:

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 14年前

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
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

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

#4

投稿記事 by MoNoQLoREATOR » 14年前

そんな仕様になっていたとは、初めて知りました。
もしかしたら今までのバグもそれが原因かも・・・。

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

閉鎖

“C言語何でも質問掲示板” へ戻る