我有以下代码来分别重载Date类的+和+=运算符。+运算符已成功重载,它将接受一个整数n,并将Date对象增加n天。这是通过连续应用next_day函数n次来完成的。
inline Date operator+(Date d, int n)
{
for(char j=1; j<=n; j++){
d=d.next_day(d);
}
return d;
}
inline Date operator+=(Date d, int n)
{
Date p=d+n;
return p;
}
我已经重载了+运算符,并使用它来定义+=的重载。但尽管编译时没有出现任何错误,当我使用重载后的+=时似乎并没有产生任何效果。
以下是我的main.cpp:
#include <iostream>
#include "Date.h"
using namespace std;
int main() {
Date Initialday = Date (12,1,2012);
Initialday+=1;
cout <<"Next day = "<< Initialday <<endl;
return 0;
}
运行主函数仍然给我返回了12/1/2012而不是12/2/2012。我做错了什么?注意:我已经重载了<<,以便以可读格式输出日期对象,所以我认为这不是问题所在。
inline Date& operator+=(Date &d, int n) { Date p = d + n; return p; }
它给我一个错误消息,说本地变量p被自动返回了。这是什么意思? - Patrick Janeoperator+
需要两个对象并从它们创建一个完全独立的对象。但是,没有理由让operator+=
需要构造一个新对象。通过使用operator+
实现operator+=
,您正在复制对象,修改副本,然后将副本复制回原始对象。这是两个不必要的副本,当它只需要修改原始对象时。 - Benjamin LindleyDate a { };
Date b { a + 1 };
我并不希望a
被a + 1
修改。但在上面的版本中,它确实被修改了,对吗? 因此,也许在operator+
中,首先使用复制构造函数,即return Date{lhs} += rhs;
- RL-Slhs
是按值传递的,这意味着它已经是一个副本了。传入的 Date 对象不受影响。 - Benjamin Lindley