请问关于函数返回临时副本的疑问
请教关于函数返回临时副本的疑问
《Ivor Hortonn's Beginning Visual C++ 2012》第295页的赋值运算符函数采用了返回引用的方式CMessage&:
CMessage& operator=(const CMessage& aMess)
{
if(this != &aMess) // Check addresses are not equal
{
// Release memory for 1st operand
delete[] pmessage;
pmessage = new char[strlen(aMess.pmessage) + 1];
// Copy 2nd operand string to 1st
strcpy_s(this->pmessage, strlen(aMess.pmessage)+1, aMess.pmessage);
}
// Return a reference to 1st operand
return *this;
}
其解释是,如果直接返回对象,以下语句将不能正确工作:
//motto1,motto2,motto3均为CMessage对象
(motto1 = motto2) = motto3 //motto1 = motto2返回的是原始对象的临时副本,临时副本是rvalue,
//rvalue不能调用成员函数,故(motto1.operator=(motto2)).operator=
//(motto3)无法正确编译。
既然如此,我想问的是,第300页的如下函数为什么却可以正确处理三个以上对象的连加?
CBox operator+(const CBox& aBox) const
{
// New object has larger length & width, and sum of heights
return CBox(m_Length > aBox.m_Length ? m_Length : aBox.m_Length,
m_Width > aBox.m_Width ? m_Width : aBox.m_Width,
《Ivor Hortonn's Beginning Visual C++ 2012》第295页的赋值运算符函数采用了返回引用的方式CMessage&:
CMessage& operator=(const CMessage& aMess)
{
if(this != &aMess) // Check addresses are not equal
{
// Release memory for 1st operand
delete[] pmessage;
pmessage = new char[strlen(aMess.pmessage) + 1];
// Copy 2nd operand string to 1st
strcpy_s(this->pmessage, strlen(aMess.pmessage)+1, aMess.pmessage);
}
// Return a reference to 1st operand
return *this;
}
其解释是,如果直接返回对象,以下语句将不能正确工作:
//motto1,motto2,motto3均为CMessage对象
(motto1 = motto2) = motto3 //motto1 = motto2返回的是原始对象的临时副本,临时副本是rvalue,
//rvalue不能调用成员函数,故(motto1.operator=(motto2)).operator=
//(motto3)无法正确编译。
既然如此,我想问的是,第300页的如下函数为什么却可以正确处理三个以上对象的连加?
CBox operator+(const CBox& aBox) const
{
// New object has larger length & width, and sum of heights
return CBox(m_Length > aBox.m_Length ? m_Length : aBox.m_Length,
m_Width > aBox.m_Width ? m_Width : aBox.m_Width,