C++重载输出运算符

C++ overloaded output operator

本文关键字:运算符 输出 重载 C++      更新时间:2023-10-16

所以我正在编写我的c++作业,最后一部分他希望我们用重载的输出/插入运算符替换格式化的输出方法(toString)。老实说,我完全不知道他这么说是什么意思。我搜索了一下,发现了使用重载插入运算符的示例代码,但似乎找不到如何将其合并到我的代码中。尽管我想我可能找错地方了。我的toString如下:

string Movie::toString() const {
    ostringstream oS;
    oS << "nn====================== Movie Informationn"
    << "n             Movie Title:t" << title << "  (" << releaseYear << ")"
    << "n    US Rank & Box Office:t" << usRank << "t$" << usBoxOffice
    << "nNon-US Rank & Box Office:t" << nonUSRank << "t$" << nonUSBoxOffice
    << "n World Rank & Box Office:t" << worldRank << "t$" << worldBoxOffice
    << "n";
    return oS.str();
}

就像我提到的,我不确定"过载"是什么意思,所以如果出于某种原因,这还不足以让你直接帮助我解决问题,那么你能简要描述一下他用过载输出运算符替换当前输出可能意味着什么吗。谢谢

编辑:这是我的下一个问题。https://stackoverflow.com/questions/14924621/c-overloaded-output-operator-cont

重载一个函数意味着提供具有相同名称但不同参数类型的其他函数。操作员也可能过载。许多运算符都有一个可以重载的对应函数operator??,其中??是运算符本身。例如,如果有两个类类型为T的对象xy,则可以重载operator+。重载一个运算符可以赋予将该运算符与类型一起使用的一些含义。所以现在你可以做x + y了。

流插入运算符是<<。这是您在执行std::cin << "hello";时使用的方法-它插入流中。这个操作符也可能过载,就像上面+过载一样。需要重载的函数称为operator<<

有两种方法可以重载像<<这样的二进制运算符(二进制运算符,因为它需要两个操作数,一个在左侧,一个位于右侧,left << right)。一种是使它成为left类型的成员,并给它一个right类型的单个参数。另一种是使其成为具有两个参数的非成员函数,一个参数为left的类型,另一个参数是right的类型。由于left的类型将是std::ostream,所以您不能修改类(因为它是由标准提供的),所以您必须使用选项二。

所以你的免费功能需要看起来像这样:

std::ostream& operator<<(std::ostream& os, const Movie& movie) {
  // Insert everything you want into `os`
  return os;
}

现在,每当执行<<时,都会调用此函数,左侧为std::ostream,右侧为Movie

我认为您的任务是编写一个重载的operator <<,它允许您将对象的字符串表示写入输出流:

std::ostream& operator <<(std::ostream& os, const Movie& movie) {
    os << "nn====================== Movie Informationn"
       << "n             Movie Title:t" << movie.title << "  (" << movie.releaseYear << ")"
       << "n    US Rank & Box Office:t" << movie.usRank << "t$" << movie.usBoxOffice
       << "nNon-US Rank & Box Office:t" << movie.nonUSRank << "t$" << movie.nonUSBoxOffice
       << "n World Rank & Box Office:t" << movie.worldRank << "t$" << movie.worldBoxOffice
       << "n";
    return os;
}

你可以像使用内置类型一样使用这个运算符:

Movie m;
// Do something with m
cout << m;      // Write m to the standard output