c++ - 如何重载 + 运算符,以便可以编写 newVacation = oldVacation + 5,//将 5 添加到 numDays,同时仅复制 numPeople

标签 c++ overloading

我正在尝试编写一个重载 + 运算符的程序。当我输入 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;
 }

最佳答案

您的运算符(operator)有未定义的行为

它被声明为返回一个新的 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;
}

关于c++ - 如何重载 + 运算符,以便可以编写 newVacation = oldVacation + 5,//将 5 添加到 numDays,同时仅复制 numPeople,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70911226/

相关文章:

C++:继承同名的重载非虚方法和虚方法会导致问题

c# - 我应该如何调用重载的扩展方法?

actionscript-3 - 在 AS3 中,如何覆盖 [] 运算符的 setter 和 getter?

c++ - 延迟加载 DLL 和关联的 .lib 文件

c++ - 第一个参数设置为第二个参数的模板化 C++ 函数作为默认参数

c++ - 你为什么要将 operator `new` 设为私有(private)?

java - 为什么我们不能在函数式接口(interface)中重载抽象方法? ( java )

c++ - 使用 SFML 的 CLion 项目退出代码 -1073741515

c++ - 如何获取 Ascii 格式 llvm 的指针类型?

iphone - 太多的 glDrawElements 导致低 fps? OpenGL ES1.1 ( iPhone )