如果operator+()
类的date
成员函数没有返回任何内容,为什么编译器不会返回错误。如果我做了
date d1,d2;
date any = d1 + d2;
然后d1 + d2
会创建一个临时的,这个临时用什么来初始化?
date operator+(date d)
{
day += d.day;
month += d.month;
year += d.year;
}
注意:它仅用于测试目的。不得用于商业用途或其他任何用途。
答案 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 +
来使const
为const
更正;因为您不打算修改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。