0

ご存じのように、私たちは通常、メソッド チェーンに参照渡しを使用します。最初のコードで参照渡しを使用すると、出力は予測どおりになります。2番目のコードブロックでは、参照渡しを使用しなかった場合、チェーンが壊れて期待した出力が生成されませんでしたが、3番目のコードブロックでは、コピーの続きでチェーンメソッドを使用して目的の結果に到達しましたコンストラクター/初期化を 1 つの宣言ステートメントで (参照による戻りを使用せずに) 行う場合、問題は、チェーンが壊れないように保護する 3 番目のコードの背後にあるロジックは何ですか?

class Calc
{
private:
    int m_value;

public:
    Calc(int value = 0) : m_value{ value } {}

    Calc& add(int value) { m_value += value; return *this; }
    Calc& sub(int value) { m_value -= value; return *this; }
    Calc& mult(int value) { m_value *= value; return *this; }

    int getValue() { return m_value; }
};

int main()
{
    Calc calc;
    calc.add(5).sub(3).mult(4); // its OK and output 8

    std::cout << calc.getValue() << '\n';
    return 0;
}

class Calc
{
private:
    int m_value;

public:
    Calc(int value = 0) : m_value{ value } {}

    Calc add(int value) { m_value += value; return *this; }
    Calc sub(int value) { m_value -= value; return *this; }
    Calc mult(int value) { m_value *= value; return *this; }

    int getValue() { return m_value; }
};

int main()
{
    Calc calc;
    calc.add(5).sub(3).mult(4); // its NOT OK and output 5

    std::cout << calc.getValue() << '\n';
    return 0;
}

class Calc
{
private:
    int m_value;

public:
    Calc(int value = 0) : m_value{ value } {}

    Calc add(int value) { m_value += value; return *this; }
    Calc sub(int value) { m_value -= value; return *this; }
    Calc mult(int value) { m_value *= value; return *this; }

    int getValue() { return m_value; }
};

int main()
{
    Calc calc = Calc{0} // copy constructor / initialization
        .add(5) // method chaining
        .sub(3) // method chaining
        .mult(4); // method chaining, its OK and output 8

    std::cout << calc.getValue() << '\n';
    return 0;
}
4

1 に答える 1