aha*_*ron 3 c++ operator-overloading stream
我如何重载"<<"运算符(对于cout)所以我可以对类k进行"cout"
sbi*_*sbi 17
任何类型的输出运算符的规范实现T是这样的:
std::ostream& operator<<(std::ostream& os, const T& obj)
{
os << obj.get_data1() << get_data2();
return os;
}
Run Code Online (Sandbox Code Playgroud)
请注意,输出流运算符通常不是成员函数.(那是因为二元运算符是成员函数,它们必须是左手参数类型的成员.然而,这是一个流,而不是你自己的类型.operator<<()对于一些内置函数有一些重载的例外,它们是输出流类的成员.)
因此,如果不是所有数据T都可公开访问,则此运算符必须是T
class T {
friend std::ostream& operator<<(std::ostream&, const T&);
// ...
};
Run Code Online (Sandbox Code Playgroud)
或者操作员调用执行流式传输的公共函数:
class T {
public:
void write_to_stream(std::ostream&);
// ...
};
std::ostream& operator<<(std::ostream& os, const T& obj)
{
obj.write_to_stream(os);
return os;
}
Run Code Online (Sandbox Code Playgroud)
后者的优点是write_to_stream()成员函数可以virtual(并且是纯的),允许流式传输多态类.
如果你想要花哨并支持各种各样的流,你必须要模仿:
template< typename TCh, typename TTr >
std::basic_ostream<TCh,TTr>& operator<<(std::basic_ostream<TCh,TTr>& os, const T& obj)
{
os << obj.get_data1() << get_data2();
return os;
}
Run Code Online (Sandbox Code Playgroud)
(但是,模板不适用于虚拟功能.)