运算符+()重载的返回值

时间:2012-02-01 08:22:34

标签: c++ operator-overloading return-value

如果operator+()类的date成员函数没有返回任何内容,为什么编译器不会返回错误。如果我做了

date d1,d2;
date any = d1 + d2;

然后d1 + d2会创建一个临时的,这个临时用什么来初始化?

date operator+(date d)  
{  
    day += d.day; 
    month += d.month; 
    year += d.year; 
}

注意:它仅用于测试目的。不得用于商业用途或其他任何用途。

5 个答案:

答案 0 :(得分:4)

因为它是operator +()而不是operator +=(),你应该创建一个临时的并返回相同的内容:

date operator + (const date &d) const
{            //  ^^^^ 1         ^^^^^ 2
  date temp = *this;  // copy current object
  ...
  return temp;  // important: -Wall warned you for missing 'return'
}

您可以看到其他两项重要更改:

(1)将d作为const引用传递;因为你不需要另一个副本

(2)通过在结尾处添加operator +来使constconst更正;因为您不打算修改this对象

更新:对于您更新的问题,这里有一个回答它的链接。

Why “not all control paths return a value” is warning and not an error?

答案 1 :(得分:2)

日期类的以下重载运算符应该返回什么?我看到它会返回垃圾。

您没有从函数返回任何内容,因此返回的值是任何randowm值,它是未定义行为

您应该使用:

显式返回Date类型的对象
return objName;

答案 2 :(得分:1)

您正在修改+的第一个操作数,这是不正确的。获取副本并将其返回:

date operator+(date d) const { 
    date r = *this;
    r.day += d.day; r.month += d.month; r.year += d.year;
    return r;
}

答案 3 :(得分:0)

date类型的对象。

您应该构建一个新日期,而不是执行各种组件的+=。这是因为您希望+运算符以传统方式表现为数字的+运算符。

答案 4 :(得分:0)

除了创建一个要返回的新对象外,没办法。 不要担心复制临时对象,大多数编译器都会在这里使用NRVO。