如何重载 + 运算符以便可以编写 newVacation = oldVacation + 5,// 将 numDays 加 5,同时仅复制 numPeople
How to overload + operator so can write newVacation = oldVacation + 5, // which adds 5 to numDays, while just copying numPeople
我正在尝试编写一个重载 + 运算符的程序。当我输入 7 和 3 时,它会正确打印:
第一个假期:天数:7,人数:3
但错误地打印:
第二个假期:天数:-158458720,人数:32764
它应该输出:
第二次假期:天数:12,人数:3
#include <iostream>
using namespace std;
class FamilyVacation {
public:
void SetNumDays(int dayCount);
void SetNumPeople(int peopleCount);
void Print() const;
FamilyVacation operator+(int moreDays);
private:
int numDays;
int numPeople;
};
void FamilyVacation::SetNumDays(int dayCount) {
numDays = dayCount;
}
void FamilyVacation::SetNumPeople(int peopleCount) {
numPeople = peopleCount;
}
// FIXME: Overload + operator so can write newVacation = oldVacation + 5,
// which adds 5 to numDays, while just copying numPeople.
FamilyVacation FamilyVacation::operator+(int moreDays) {
numDays = moreDays + 5;
}
void FamilyVacation::Print() const {
cout << "Days: " << numDays << ", People: " << numPeople << endl;
}
int main() {
FamilyVacation firstVacation;
FamilyVacation secondVacation;
int userDays;
int userPeople;
cin >> userDays;
cin >> userPeople;
cout << "First vacation: ";
firstVacation.SetNumDays(userDays);
firstVacation.SetNumPeople(userPeople);
firstVacation.Print();
cout << "Second vacation: ";
secondVacation = firstVacation + 5;
secondVacation.Print();
return 0;
}
您的操作员有 未定义的行为。
它被声明为返回一个新的 FamilyVacation
对象,但实际上根本没有返回任何东西。这就是 secondVacation.Print()
打印垃圾的原因。
更糟糕的是,您的操作员正在修改被调用的对象(甚至没有使用 正确的 值修改它!),这是此操作员的错误行为实行。参见 What are the basic rules and idioms for operator overloading?
试试这个:
FamilyVacation FamilyVacation::operator+(int moreDays)
{
FamilyVacation ret;
ret.SetNumDays(numDays + moreDays);
ret.SetNumPeople(numPeople);
return ret;
}
我正在尝试编写一个重载 + 运算符的程序。当我输入 7 和 3 时,它会正确打印: 第一个假期:天数:7,人数:3 但错误地打印: 第二个假期:天数:-158458720,人数:32764 它应该输出: 第二次假期:天数:12,人数:3
#include <iostream>
using namespace std;
class FamilyVacation {
public:
void SetNumDays(int dayCount);
void SetNumPeople(int peopleCount);
void Print() const;
FamilyVacation operator+(int moreDays);
private:
int numDays;
int numPeople;
};
void FamilyVacation::SetNumDays(int dayCount) {
numDays = dayCount;
}
void FamilyVacation::SetNumPeople(int peopleCount) {
numPeople = peopleCount;
}
// FIXME: Overload + operator so can write newVacation = oldVacation + 5,
// which adds 5 to numDays, while just copying numPeople.
FamilyVacation FamilyVacation::operator+(int moreDays) {
numDays = moreDays + 5;
}
void FamilyVacation::Print() const {
cout << "Days: " << numDays << ", People: " << numPeople << endl;
}
int main() {
FamilyVacation firstVacation;
FamilyVacation secondVacation;
int userDays;
int userPeople;
cin >> userDays;
cin >> userPeople;
cout << "First vacation: ";
firstVacation.SetNumDays(userDays);
firstVacation.SetNumPeople(userPeople);
firstVacation.Print();
cout << "Second vacation: ";
secondVacation = firstVacation + 5;
secondVacation.Print();
return 0;
}
您的操作员有 未定义的行为。
它被声明为返回一个新的 FamilyVacation
对象,但实际上根本没有返回任何东西。这就是 secondVacation.Print()
打印垃圾的原因。
更糟糕的是,您的操作员正在修改被调用的对象(甚至没有使用 正确的 值修改它!),这是此操作员的错误行为实行。参见 What are the basic rules and idioms for operator overloading?
试试这个:
FamilyVacation FamilyVacation::operator+(int moreDays)
{
FamilyVacation ret;
ret.SetNumDays(numDays + moreDays);
ret.SetNumPeople(numPeople);
return ret;
}