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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

2回答

277閲覧

C++ オーバーロードについて

012304

総合スコア13

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2022/03/06 04:51

編集2022/03/06 05:01

C++を学び始めて気になったことがあって例題で
class operator+ class(const class c){ return *this } 例題なので型の名前がclassなのはご了承ください。
たまにこういう書き方をしている例題のコードがあると思うのですが、これってどういう意味があるのかわかりません。このreturnで帰ってくる値って何が帰ってくるのですか?オーバーロードはこの中にやりたいことを記号に沿って書くのだと思うのですが、return*thisのような書き方をするのってなぜかわかりますか?

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

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

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

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

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

vann_2921

2022/03/06 05:51

>return*thisのような書き方をするのってなぜかわかりますか? 調べたらいろんなサイトで解説されていると思うのですが、調べたうえで分からないとおっしゃっているのでしょうか? どの資料を見たのかご提示いただけますか?
012304

2022/03/06 08:16 編集

修正依頼をしていただいた後に回答ありがとうございます。コードが間違っていました回答での修正ありがとうございます。前にオーバーロードのことを調べていた時に例題としてオーバーロードの A operator+(A a){ return *this;} ただこれだけのものを見たことがあって、その見たということだけをふと思い出したのですが、サイトの名前を思い出せず、そういえばなぜこういう書き方をしているんだろう、自分が解釈しているそのオブジェクトをそのまま返すこと以外に何かあるのだろうかと思ったことを思い出し、質問させていただきました。なのでサイトのリンクを乗せることができません。
vann_2921

2022/03/06 10:55

厳しい言い方になるかもしれませんが疑問に思ったのなら調べればいいのにどうしてそれをやらないのでしょうか?サイトが分からないからリンク張れませんではないでしょう。 今回は私が暇だったので回答しましたが、質問サイトでは必ず回答が得られるとは限りません。私が回答しなかったら一生疑問に思ったまま過ごしたのでしょうか? 質問の前に調べて、調べたうえで分からないことを聞くのが質問サイトのスマートな使い方だと思います。その方が回答をもらえる確率も上がります。 teratailでは私のような心無い回答者に絡まれることもあるので、自衛のためにも事前に調べることをお勧めします。
012304

2022/03/07 03:00 編集

すみません、忠告痛み入ります。以後気を付けます。
guest

回答2

0

operator +*this を返すというのはどうなのか?
(まぁそのclass的にそうあるべきなのであれば,何でもやっていいのですが…)
それは operator += だったのではないだろうか? ……とか思います.

演算子のオーバーロードは特にその字面と異なる動作が実装されていると「???」って混乱する元になりますので,
特殊な理由が無いなら,ふつーの(intみたいな)型と同様の意味を持つ処理にしておくと良いでしょう.
a+b って書いてるの見て, a の中身が変わるとは思わないよね.)

また,ごく普通に演算子を使う式を書いてたら「それこの型には書けないから.残念.」とか言われると不便なので,
これもまた,特殊な理由が無いならば,ふつーの型と同様に処理を書ける形に実装しておくと良いでしょう.
例えば int 等では以下のように書けますが,自身の型での演算でこれを禁止する理由が特に無いならば,これができる方が素直というか.

C++

1int a = 5; 2int b = (a+=5) + 7; //operator+= が aへの参照 を返してくれないとこれができない

return *this; を書く話については,
前述のような(int と同じ振る舞いがどうのという)話もありますし,
また,*this を返しておけば,例えば,

C++

1class X 2{ 3public: 4 X &operator +=( const X &rhs ) 5 { 6 //なんか rhs のデータを自身に加算するような処理をして… 7 ... 8 //自身への参照を返す 9 return *this; 10 } 11 12 void SomeMethod(){} //なんかメソッド 13}; 14 15//--- 16 17X a,b; 18(a += b).SomeMethod(); //operator+= が aへの参照を返すから,こういう風にしてaのメソッドを呼ぶ処理が書ける

みたいな書き方ができて便利.

投稿2022/03/07 02:08

編集2022/03/07 02:16
fana

総合スコア11658

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

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

0

ベストアンサー

オペレータの書き方を日本語にするとこんな感じです。

返り値の型 operator演算子の記号(引数){ やりたいこと; return 返す値;}

ご提示のオペレータは分かりにくいというか間違っているので以下のように書き換えます。

c++

1class A{ 2 A operator+(const A a){ 3 //ここにやりたいこと(クラス A 同士の足し算)を書く 4 return *this; 5 } 6};

ここで引数はA同士を足し算したいなら、引数にAを渡しますし、intを足したいならintを渡します。

c++

1class A{ 2public: 3 int value = 1; //クラスAはint型の値を1つ持っていてその初期値は1とする 4 A operator+(const A a){ 5 this->value += a.value; //引数がクラスAの時はメンバ変数のvalue同士を足し算する 6 return *this; 7 } 8 A operator+(const int i){ 9 this->value += i; //引数がintの時はメンバ変数のvalueにiを足し算する 10 return *this; 11 } 12};

ここでちょっと問題なのがreturn *this;です。
例えば以下の例を考えてみます。

c++

1int main(){ 2 A a1, a2; 3 a1.value = 2; 4 a2.value = 3; 5 A a3 = a1 + a2; // 2 + 3 = 5 6 A a4 = a1 + a3; // 2 + 5 = 7 7}

a4.valueは7になって欲しいのですが実際は10になってしまいます。なぜならオペレータのところで複合代入(+=)しているからです。足し算するたびにvalueの値が変わるのでおかしくなります。
足し算の度に値が変わらないようにするには以下のように書きます。

c++

1class A{ 2public: 3 int value = 1; //クラスAはint型の値を1つ持っていてその初期値は1とする 4 A operator+(const A a){ 5 A result; //結果を格納するための新しいA 6 result.value = this->value + a.value; //引数がクラスAの時はメンバ変数のvalue同士を足し算する 7 return result; 8 } 9 A operator+(const int i){ 10 A result; //結果を格納するための新しいA 11 result.value = this->value + i; //引数がintの時はメンバ変数のvalueにiを足し算する 12 return result; 13 } 14};

なのでオペレータが必ず*thisを返す必要はないです。

投稿2022/03/06 06:38

vann_2921

総合スコア190

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

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

012304

2022/03/06 09:10

質問の追記の方にお礼と追記をしました。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問