读书人

为什么重载运算符operator+返回对象不

发布时间: 2012-03-28 15:40:03 作者: rapoo

为什么重载运算符operator+返回对象不能用引用,而operator=返回对象必需用引用呢
源码如下:
重载运算符operator+:
Date Date::operator+(int n) const
{
Date dt=*this;
n+=dt.da;
while(n> dys[dt.mo-1])
{
n-=dys[dt.mo-1];
if(++dt.mo==13)
{
dt.mo=1;
dt.yr++;
}
}
dt.da=n;
return dt;
}

重载运算符operator=:
Date& Date::operator=(const Date& dt)
{
if(this!=&dt)
{
mo=dt.mo;
da=dt.da;
yr=dt.yr;
}
return *this;
}




[解决办法]
Date Date::operator+(int n) const
{
Date dt=*this;
n+=dt.da;
while(n> dys[dt.mo-1])
{
n-=dys[dt.mo-1];
if(++dt.mo==13)
{
dt.mo=1;
dt.yr++;
}
}
dt.da=n;
return dt;
}


dt是一个局部变量,返回引用是要出问题的
[解决办法]
而operator=返回引用是考虑

a=b=c;

这样的赋值,如果返回拷贝,则有无穷递归的问题
[解决办法]
operator+返回对象不能用引用
原因:
因为返回的对象是一个临时的对象,运算完后就会自动释放,如果用引用结果会出现什么问题,我想你应该明白吧!
而operator=返回对象必需用引用
原因:
如果不用引用,返回也是一个对象的话,那你参数里的const Date& dt,不是又是引用了一个临时的对象了吗?
其实归根到底是一个原因!


[解决办法]
+号如果返回引用,
一种是返回*this
另一种是返回新建的对象的引用

前者导致加数也被改
后者导致返回垃圾

所以只能返回对象


=号返回引用,
保证了效率,
支持了连续的=号操作

若返回对象,
效率低下,
并不支持连续=号操作

读书人网 >C++

热点推荐