如您所知,我们通常使用引用返回进行方法链接,我在第一段代码中使用引用返回,输出与我预测的一样。在第二个代码块中,当我没有使用引用返回时,链被破坏,我的预期输出没有生成,但在第三个代码块,我使用链式方法在一个声明语句中继续复制构造函数/初始化(不使用引用返回(,达到了所需的结果,问题是,保护链条不断裂的第三个代码背后的逻辑是什么?
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;
}
保护链不断裂的第三个代码背后的逻辑是什么?
Chain确实会中断,但您使用最终结果分配给calc
Calc calc = Calc{0}.add(5).sub(3).mult(4);
相当于
Calc calc = Calc{2}.mult(4);
当与4
相乘时,最终将副本构造为calc
的是一个临时Calc
对象。