質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1082閲覧

Postfix Increment ++ Operator Overloadingについて

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/01/28 03:15

編集2019/01/31 03:24

下記のサイト「Learn C++」;
https://www.programiz.com/cpp-programming/increment-decrement-operator-overloading
に、変数に対して前置きのオペレータと、後置きのオペレータについて例題を示して解説があります。

下記に引用するこの例題の中に、例えばオペレータが++であれば、後置きの場合はオペレータ関数の定義時に、Class-Name operator ++ (int)と記述する、とあります。

この理由に、
This int gives information to the compiler that it is the postfix version of operator.
Don't confuse this int doesn't indicate integer.
として、
「この括弧内のintintegerの意味ではなく、コンパイラにこのオペレータが後置き型であることを示しているのだ」、
と言っています。

私は、intintegerの意味、と学んできたので戸惑っています。
これについて、入門者向けの解説が出来る方に、ご案内をおねがいします。

html

1//引用する例題 2#include <iostream> 3using namespace std; 4class Check 5{ 6 private: 7 int i; 8 public: 9 Check(): i(0) { } 10 Check operator ++ () 11 { 12 Check temp; 13 temp.i = ++i; 14 return temp; 15 } 16 // Notice int inside barcket which indicates postfix increment. 17 Check operator ++ (int) 18 { 19 Check temp; 20 temp.i = i++; 21 return temp; 22 } 23 void Display() 24 { cout << "i = "<< i <<endl; } 25}; 26int main() 27 28{ 29 Check obj, obj1; 30 obj.Display(); 31 obj1.Display(); 32 // Operator function is called, only then value of obj is assigned to obj1 33 obj1 = ++obj; 34 obj.Display(); 35 obj1.Display(); 36 // Assigns value of obj to obj1, only then operator function is called. 37 obj1 = obj++; 38 obj.Display(); 39 obj1.Display(); 40 return 0; 41}

html

1//引用した例題の出力結果 2Output 3i = 0 4i = 0 5i = 1 6i = 1 7i = 2 8i = 1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「この括弧内の「int」は「integer」の意味ではなく、コンパイラにこのオペレータが後置き型であることを示しているのだ」

より丁寧な説明では:

ここでの int 型引数は「引数に整数(integer)を1つ受け取る」という一般的な意味ではなく、「該当の演算子オーバーロードが、(前置オペレータではなく)後置オペレータに対応することを示すだけに利用されるダミー引数」になります。


前置オペレータ(++x)と後置オペレータ(x++)は、どちらも操作対象として変数を1つだけ取ります。つまり、何か特別な仕掛けを用意しない限りは構文上この2者を区別できません。

c++

1struct UserType { 2 // ++x / x++ のどちらに対応? 3 UserType operator++() { thisを操作 } 4}

C++言語ではこの問題を解決するため、引数無しオーバーロードを前置オペレータ、ダミーint型引数を1つとるオーバーロードを後置オペレータに対応させると決めました。これは int 型である必要もないのですが、単にそう決めたという意味しか持ちません。

c+++

1struct UserType { 2 // 前置オペレータ 3 UserType& operator++() { thisを操作 } 4 // 後置オペレータ 5 UserType operator++(int) { thisを操作 } 6}

おまけ:本ケースのような「引数の値に意味はないが、型情報を利用して関数オーバーロードを用意する」テクニックは、C++ではタグ・ディスパッチ(tag dispatch)とも呼ばれます。興味があれば調べてみてください。

投稿2019/01/28 04:25

編集2019/01/28 04:32
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/28 05:25

分かりやすいご案内を頂ありがとうございます。 tag dispatch、少し読んでみましたが、まだちょっと自分には難しいので、この機会に温めておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問