回答編集履歴
4
微修正
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
微修正
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と評価され
|
8
|
+
なので (300, 500) は 500と評価されるのですが、
|
9
|
+
関数(ここでは operator+)はstringを返すと定義したのですから、
|
8
10
|
コンパイラは500をstringに変換しようと試みます。
|
9
11
|
|
10
|
-
その結果stringのコンストラクタとマッチするので string(500)、
|
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
追記
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
加筆
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
|
+
後者は関数(ここではコンストラクタ)の引数を指定するカッコ
|