C++ 运算符的返回值+;()过载
如果C++ 运算符的返回值+;()过载,c++,operator-overloading,return-value,C++,Operator Overloading,Return Value,如果date类的operator+()成员函数未返回任何内容,为什么编译器不返回错误。如果我这样做 date d1,d2; date any = d1 + d2; 然后,d1+d2将创建一个临时文件,这个临时文件用什么初始化 date operator+(date d) { day += d.day; month += d.month; year += d.year; } 注:仅用于测试目的。不用于商业用途或任何用途。因为它是运算符+()而不是运算符+=
date
类的operator+()
成员函数未返回任何内容,为什么编译器不返回错误。如果我这样做
date d1,d2;
date any = d1 + d2;
然后,d1+d2
将创建一个临时文件,这个临时文件用什么初始化
date operator+(date d)
{
day += d.day;
month += d.month;
year += d.year;
}
注:仅用于测试目的。不用于商业用途或任何用途。因为它是
运算符+()
而不是运算符+=()
,所以您应该创建一个临时值并返回相同的值:
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) 通过在末尾添加const
将运算符+
设置为const
正确;因为您不打算修改此对象
更新:对于您更新的问题,这里有一个链接可以解答
日期类的以下重载运算符应该返回什么?我看到它返回垃圾。 您没有从函数返回任何内容,因此返回的值是任何randowm值,并且它是一种未定义的行为 您应该使用以下命令显式返回类型为
Date
的对象:
return objName;
您正在修改
+
的第一个操作数,这是不正确的。获取副本并将其返回:
date operator+(date d) const {
date r = *this;
r.day += d.day; r.month += d.month; r.year += d.year;
return r;
}
类型为
date
的对象
您应该构造一个新的日期,而不是对各个组件执行
+=
。这是因为您希望+运算符的行为与数字的+运算符的行为相同。除了创建要返回的新对象之外,别无选择。
不要担心复制临时对象,大多数编译器都会在这里使用NRVO。+1用于使用引用常量参数。太多人对非预定义类型使用“堆栈”非引用非指针参数!可能值得补充的是,这里常用的习惯用法是1)使
操作符+
成为一个自由函数(但这当然不是必需的,除非有到日期的隐式转换),2)根据操作符+=
实现它。(您还有几个数据
的实例,应该是日期
)+1,如果日期只有几个字节,则示例代码具有运算符+@vulkanino的正确函数原型,传递值可能很快。我还认为您需要重新考虑您的实现——否则您将得到奇怪的结果,比如15个月的第60个月!添加日期有什么意义?