回答編集履歴
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 | 
            +
            後者は関数(ここではコンストラクタ)の引数を指定するカッコ
         | 
