回答編集履歴

4

微修正

2022/01/08 08:09

投稿

episteme
episteme

スコア16614

test CHANGED
@@ -20,9 +20,9 @@
20
20
 
21
21
 
22
22
 
23
- その結果stringのコンストラクタとマッチするので string(500)、
23
+ その結果stringのコンストラクタ:string(int x=0, int y=0)とマッチするので string(500)、
24
24
 
25
- デフォルト引数で y=0 が補われて string(500,0) が返ります。
25
+ すなわちデフォルト引数で y=0 が補われて string(500,0) が返ります。
26
26
 
27
27
 
28
28
 

3

微修正

2022/01/08 08:09

投稿

episteme
episteme

スコア16614

test CHANGED
@@ -4,19 +4,25 @@
4
4
 
5
5
  「それがルールだから」では納得できませんかね。
6
6
 
7
+
8
+
7
9
  return (p + stm.p, q + stm.q);
8
10
 
9
- 式を , で繋ぐと左から順に評価され、(~) 全体としては最終式の評価値となります。それがルール。
11
+ 式を , で繋ぐと左から順に評価され、(~) 全体としては最終式の評価値となります。まずそれがルール。
10
12
 
11
13
 
12
14
 
13
- なので (300, 500) は 500と評価され、500を返したいが関数はstringを返すと定義したのですから
15
+ なので (300, 500) は 500と評価されのです
16
+
17
+ 関数(ここでは operator+)はstringを返すと定義したのですから、
14
18
 
15
19
  コンパイラは500をstringに変換しようと試みます。
16
20
 
17
21
 
18
22
 
19
- その結果stringのコンストラクタとマッチするので string(500)、デフォルト引数で y=0 が補われて string(500,0) が返ります。
23
+ その結果stringのコンストラクタとマッチするので string(500)、
24
+
25
+ デフォルト引数で y=0 が補われて string(500,0) が返ります。
20
26
 
21
27
 
22
28
 

2

追記

2022/01/08 08:07

投稿

episteme
episteme

スコア16614

test CHANGED
@@ -33,3 +33,19 @@
33
33
  前者は評価の優先度を強制する(数式で出てくるフツーの)カッコ
34
34
 
35
35
  後者は関数(ここではコンストラクタ)の引数を指定するカッコ
36
+
37
+
38
+
39
+ [追記] いまどきのC++なら
40
+
41
+ ```C++
42
+
43
+ string operator+(string& stm) {
44
+
45
+ return {p + stm.p, q + stm.q};
46
+
47
+ }
48
+
49
+ ```
50
+
51
+ と書くとアラ不思議...

1

加筆

2022/01/08 06:52

投稿

episteme
episteme

スコア16614

test CHANGED
@@ -25,3 +25,11 @@
25
25
 
26
26
 
27
27
  stringのコンストラクタを明示的に呼び出すからです。
28
+
29
+
30
+
31
+ ※ 両者は () の意味が違う。
32
+
33
+ 前者は評価の優先度を強制する(数式で出てくるフツーの)カッコ
34
+
35
+ 後者は関数(ここではコンストラクタ)の引数を指定するカッコ