C++中重载<<的常见用法

发布时间:2026/8/3 3:50:55

C++中重载<<的常见用法 // point.h#pragma once#include iostreamclass Point {public:Point(int x, int y);// ... 其他成员函数 ...private:int x_;int y_;// 方案 A声明为友元如果需要访问 private 成员friend std::ostream operator(std::ostream os, const Point p);// 方案 B如果只是用 public 接口甚至不需要 friend// int getX() const { return x_; }// int getY() const { return y_; }};// 注意函数原型必须写在类外面std::ostream operator(std::ostream os, const Point p);// point.cpp#include point.hPoint::Point(int x, int y) : x_(x), y_(y) {}// 实现 operatorstd::ostream operator(std::ostream os, const Point p) {os [ p.x_ , p.y_ ];return os;}#include point.h#include iostreamint main() {Point p(1, 2);std::cout p std::endl;}避免多重定义ODR规则如果你把函数的定义函数体直接写在.h文件里并且这个头文件被多个.cpp文件包含那么链接器会发现同一个函数有多个定义导致链接错误。.cpp文件通常只会被编译一次所以把定义放在这里最安全。减少编译依赖如果把实现放在.cpp里当你修改operator的内部逻辑时只需要重新编译point.cpp而不需要重新编译所有包含了point.h的文件。这能显著加快大型项目的编译速度。符合封装原则类的接口.h告诉用户“有什么”类的实现.cpp隐藏了“怎么做”。

相关新闻