teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

微修正

2022/01/08 08:09

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -9,8 +9,8 @@
9
9
  関数(ここでは operator+)はstringを返すと定義したのですから、
10
10
  コンパイラは500をstringに変換しようと試みます。
11
11
 
12
- その結果stringのコンストラクタとマッチするので string(500)、
12
+ その結果stringのコンストラクタ:string(int x=0, int y=0)とマッチするので string(500)、
13
- デフォルト引数で y=0 が補われて string(500,0) が返ります。
13
+ すなわちデフォルト引数で y=0 が補われて string(500,0) が返ります。
14
14
 
15
15
  > return文の際にreturn string(p + stm.p, q + stm.q)と書くとなぜしっかりpとqの足した値が返ってくるのでしょうか?
16
16
 

3

微修正

2022/01/08 08:09

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -1,13 +1,16 @@
1
1
  > ここで疑問なのですが、なぜこのようなコードにすると結果が(500,0)と返ってくるのでしょうか?
2
2
 
3
3
  「それがルールだから」では納得できませんかね。
4
+
4
5
  return (p + stm.p, q + stm.q);
5
- 式を , で繋ぐと左から順に評価され、(~) 全体としては最終式の評価値となります。それがルール。
6
+ 式を , で繋ぐと左から順に評価され、(~) 全体としては最終式の評価値となります。まずそれがルール。
6
7
 
7
- なので (300, 500) は 500と評価され、500を返したいが関数はstringを返すと定義したのですから
8
+ なので (300, 500) は 500と評価されのです
9
+ 関数(ここでは operator+)はstringを返すと定義したのですから、
8
10
  コンパイラは500をstringに変換しようと試みます。
9
11
 
10
- その結果stringのコンストラクタとマッチするので string(500)、デフォルト引数で y=0 が補われて string(500,0) が返ります。
12
+ その結果stringのコンストラクタとマッチするので string(500)、
13
+ デフォルト引数で y=0 が補われて string(500,0) が返ります。
11
14
 
12
15
  > return文の際にreturn string(p + stm.p, q + stm.q)と書くとなぜしっかりpとqの足した値が返ってくるのでしょうか?
13
16
 

2

追記

2022/01/08 08:07

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -15,4 +15,12 @@
15
15
 
16
16
  ※ 両者は () の意味が違う。
17
17
  前者は評価の優先度を強制する(数式で出てくるフツーの)カッコ
18
- 後者は関数(ここではコンストラクタ)の引数を指定するカッコ
18
+ 後者は関数(ここではコンストラクタ)の引数を指定するカッコ
19
+
20
+ [追記] いまどきのC++なら
21
+ ```C++
22
+ string operator+(string& stm) {
23
+ return {p + stm.p, q + stm.q};
24
+ }
25
+ ```
26
+ と書くとアラ不思議...

1

加筆

2022/01/08 06:52

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -11,4 +11,8 @@
11
11
 
12
12
  > return文の際にreturn string(p + stm.p, q + stm.q)と書くとなぜしっかりpとqの足した値が返ってくるのでしょうか?
13
13
 
14
- stringのコンストラクタを明示的に呼び出すからです。
14
+ stringのコンストラクタを明示的に呼び出すからです。
15
+
16
+ ※ 両者は () の意味が違う。
17
+ 前者は評価の優先度を強制する(数式で出てくるフツーの)カッコ
18
+ 後者は関数(ここではコンストラクタ)の引数を指定するカッコ