C++ 重载 << 运算符

C++ overloading the << operator

我正在尝试重载 C++ 中的 << 运算符,我已经正确实现了代码,但我对重载概念的整体工作有一些疑问。

  1. 为什么operator<<函数中的ostream对象需要传递 通过参考?
  2. 为什么函数的 return 类型不能是 'std::ostream' 而不是 'std::ostream&' ?

  3. 是ostreamclass的属性需要 'operator<<'函数到return一个内存地址或者做所有的 运算符重载需要通过引用传递并且 return 类型也应该是参考?

这是代码。

    #include<iostream>
    enum MealType{NO_PREF,REGULAR,LOW_FAT,VEGETARIAN};

    struct Passenger{
            char name[30];
            MealType mealPref;
            bool freqFlyer;
            int passengerNo;
    };

    //Overloading the << operator

    std::ostream& operator<<(std::ostream& out,const Passenger& pass){
            out<<pass.name<<" "<<pass.mealPref;
            if(pass.freqFlyer){
                    out<<" "<<"Passenger is a freqent flyer ";
            }
            else{
                    out<<" "<<"Passenger is not a frequent flyer ";
            }
            return out;
    }

int main(){
        Passenger p1 = {"Jacob",LOW_FAT,false,2342};
        std::cout<<p1;
        return 0;
}

编辑 1: 为什么我必须在重载函数定义中使用 << 运算符。它的功能是像移位还是像 << in std::cout<<" ";

并非所有运算符重载都需要通过引用传递。例如,如果你写了一个 class 封装了一个 2D 点,你为其中两个做了一个 operator-,你可能会按值获取参数(因为它们是小而简单的类型 "value semantics"),并且它将 return 按值计算距离(因为可能没有可以 returned 的预分配距离对象,您正在创建一个新对象)。即:

dist2d operator-(point2d a, point2d b) {
    return {a.x - b.x, a.y - b.y};
}

std::ostream 不可复制,因为复制一个流(不包含其自己的历史记录)意味着什么?所以你必须始终通过引用或指针传递它。