首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么重载运算符operator+返回对象不能用引用,而operator=返回对象必需用引用呢,该如何处理

2012-03-28 
为什么重载运算符operator+返回对象不能用引用,而operator返回对象必需用引用呢源码如下:重载运算符opera

为什么重载运算符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
另一种是返回新建的对象的引用

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

所以只能返回对象


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

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

热点排行