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 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

0

保护链不被破坏的第三个代码背后的逻辑是什么?

链确实会中断,但您使用最终结果分配给calc

Calc calc = Calc{0}.add(5).sub(3).mult(4);

相当于

Calc calc = Calc{2}.mult(4);

最终将复制构造成的是乘以 时calc的临时对象。Calc4

于 2018-07-22T11:53:44.773 回答