前提・実現したいこと
C++の初学者です。
クラスで演算子オーバーロードを試しています。
operator ++ の前に & をつける必要があるのかないのか、よくわかりません。
付けてもつけなくても結果が同じなのですが、参考書では&をつけています。
一方で、operator +については、参考書では&をつけていません。
&の要不要、必要ならばその意味について教えていただければ幸いです。
該当のソースコード
#include <iostream>
struct IntLike { int data; };
IntLike & operator ++(IntLike & obj)
{
++obj.data;
return obj;
}
int main()
{
IntLike a{ 1 };
++a;
std::cout << a.data;
return 0;
}
補足情報(FW/ツールのバージョンなど)
Visual Studio 2017を使用しています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/07 00:20
回答3件
0
C++
1IntLike & operator ++(IntLike & obj) 2{ 3++obj.data; 4return obj; 5}
& をつけると obj そのものが返りますが、
つけないと obj のコピーが返ります。
なので
C++
1#include <iostream> 2 3struct IntLike { int data; }; 4 5IntLike operator ++(IntLike & obj) { // &つけない 6 ++obj.data; 7 return obj; 8} 9 10int main() { 11 IntLike a{ 1 }; 12 (++a).data = 123; 13 std::cout << a.data << std::endl; 14 15 return 0; 16}
これだと a.data は 2 となります。
投稿2021/06/05 08:50
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/05 11:25
2021/06/05 12:53
2021/06/07 00:31 編集
2021/06/07 00:30
2021/06/08 14:29 編集
0
&
は参照を意味します。 質問の例の場合には operator++
の返却値は引数として渡された obj
と同一の存在であるということです。 &
を付けなかった場合には値が同じ新しいオブジェクトが新しく作られて返却されるということになります。
あなたがどうしたいかによって使い分ける必要があるので、まずは参照がどういうものであるのかについて学んでください。
ただし、習慣的には整数型の挙動と一致させるべきであると考えられているため、前置インクリメントの返却値には &
を付け (参照を返し) て後置インクリメントの場合には &
を付けない (新しくオブジェクトを生成して返す) のが普通です。
投稿2021/06/05 08:49
総合スコア5686
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/05 11:30
2021/06/05 12:06
2021/06/07 00:30
0
ベストアンサー
operator ++i の前に & をつける必要があるのかないのか、よくわかりません。
付けてもつけなくても結果が同じなのですが、参考書では&をつけています。
operator++ の前に & をつけるのは関数の返却値を左辺値にするためです。
返却値の使い方によっては結果が異なります。
質問のコードでは、++a;
という形で operator++ を呼び出しているので、
返却値を使っていません。
& を付けて返却値が左辺値の場合、
IntLint a{1}, b{3}; ++a = b; (++a).data = 5;
のように
返却値を変数として、IntLike全体や、メンバの data を変更できます。
& を付けなくて返却値が右辺値の場合、
cout << ++a.data; や b = ++a;
のように返却値の値を参照することできますが
値を変更することができません。
さらに、回答に対するコメントを見ると、
operator++ の後の引数に & を付ける場合と付けない場合について混同しています。
これは別の問題です。
operator++ の前に & を付けているのは、本来の前置演算子 ++ が左辺値を
返すからそれに従っただけでしょう。int i = 3; ++i = 5; と書けます。
operator+ の前に & を付けないのは、本来の加法演算子+ が右辺値を返すから
それに従っただけでしょう。
int i = 3, j = 5; (i + j) = 7;
とは書けません。
投稿2021/06/08 16:33
編集2021/06/09 03:16総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/09 02:42
2021/06/09 03:15
2021/06/09 04:15
2021/06/09 05:19 編集
2021/06/09 05:22
2021/06/09 05:57
2021/06/09 13:48
2021/06/12 11:57
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。