为什么“operator<<()”重载定义中需要“friend”?

Chr*_*uts 0 c++ class operator-overloading friend

class Train{
public: 
    char direction;
    int loading_time, crossing_time;        
    ...

    friend std::ostream& operator<<(std::ostream& os, const Train& t){
        os << t.direction << '/' << t.loading_time << '/' << t.crossing_time;
        return os;
    }
};
Run Code Online (Sandbox Code Playgroud)

为什么在这种情况下需要“朋友”?所有属性都是公共的。我应该只使用结构体吗?

Ami*_*rsh 5

friend为了使该函数成为全局函数,需要使用。如果省略它,该函数将被视为成员函数,在这种情况下它应该只获得一个参数,并且调用者应该是类型Train(我们声明的类类型),这不符合我们的需求。

您可以在您的情况下使用全局函数:

class Train{
public: 
    char direction;
    int loading_time, crossing_time;        
    ...

};

std::ostream& operator<<(std::ostream& os, const Train& t){
    os << t.direction << '/' << t.loading_time << '/' << t.crossing_time;
    return os;
}
Run Code Online (Sandbox Code Playgroud)

然而,对于这个用例,使用友元函数(而不是非友元全局函数)是很常见的,因为它是在类内部声明的,这是您获得的一个重要的额外好处。