C++中std::ostream类是否内置实现了operator<<运算符?
你的认知完全正确。
核心原理说明
你在IDE中跳转看到的using ostream = basic_ostream<char, char_traits<char>>;并不是最终的类定义,std::ostream本质是模板类std::basic_ostream针对char字符类型的别名,标准库已经在std::basic_ostream的实现中内置了多组operator<<重载:
- 作为类成员函数的
operator<<:专门处理int、double、bool、const char*等基础类型的输出,你代码中stream << other.u调用的就是std::basic_ostream针对int类型的成员运算符重载。 - 作为全局函数的
operator<<:处理std::string、标准库容器等类型的输出,和你自己实现的Vector2全局运算符重载逻辑完全一致。
普通IDE默认不会直接展示标准库模板的内部实现代码,所以你跳转只会到别名定义,看不到具体的运算符重载实现。
示例代码执行流程
std::cout << Vector2(10, 20)匹配你实现的全局operator<<,std::cout作为第一个std::ostream&参数传入,临时Vector2对象作为第二个参数传入- 函数内部
stream << other.u匹配std::basic_ostream的int类型成员重载,输出数值10 - 接着
<< ", "匹配const char*类型的成员重载,输出逗号和空格 - 再
<< other.v再次调用int类型的成员重载,输出数值20 - 最终返回
stream引用,支持链式调用语法
内容的提问来源于stack exchange,提问作者Joe Smith
相关产品推荐
相关产品推荐

