Menu
CoddyTech

流运算符

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 43 课,共 104 课。

流插入运算符(<<)和流提取运算符(>>)可以让你将自定义类与 std::cout 和 std::cin 一起使用。与我们目前介绍过的运算符不同,这些运算符必须实现为非成员函数,因为左操作数是流,而不是你的类。

class Point {
    int x, y;
    
public:
    Point(int x, int y) : x(x), y(y) {}
    
    // 声明为友元,以便访问私有成员
    friend std::ostream& operator<<(std::ostream& os, const Point& p);
    friend std::istream& operator>>(std::istream& is, Point& p);
};

std::ostream& operator<<(std::ostream& os, const Point& p) {
    os << "(" << p.x << ", " << p.y << ")";
    return os;
}

std::istream& operator>>(std::istream& is, Point& p) {
    is >> p.x >> p.y;
    return is;
}

这两个运算符都会返回流的引用,因此可以像这样进行链式调用:std::cout << p1 << p2。插入运算符通过 const 引用接收对象,因为它只读取数据;而提取运算符接收非 const 引用,因为它会修改对象。

现在你可以在流中自然地使用 Point:

Point p(3, 4);
std::cout << "Location: " << p << std::endl;    // 输出:Location: (3, 4)

Point p2(0, 0);
std::cin >> p2;    // 将两个整数读入 p2
challenge icon

挑战

简单

让我们构建一个 Temperature 类,通过重载流运算符,让它能与 std::cout 和 std::cin 无缝配合使用。这是一个实用场景:你可以用易读的格式显示温度,也可以自然地从输入中读取温度。

你将创建两个文件来组织代码:

  • Temperature.h:定义一个 Temperature 类,用于存储温度值(类型为 double)和单位标签(类型为 char,可以是表示摄氏度的 'C' 或表示华氏度的 'F')。你的类应包含:
    • 用于存储温度值和单位的私有成员
    • 默认构造函数,将温度初始化为 0.0 摄氏度
    • 带参数的构造函数,接收一个值和一个单位
    • 获取器 getValue() 和 getUnit()(两者均为 const)
    • 流插入运算符(<<)和流提取运算符(>>)的友元声明

    将流运算符实现为非成员函数:

    • 插入运算符应以 VALUE UNIT 的格式输出温度(例如,25.5 C 或 77.9 F)。温度值保留一位小数。
    • 提取运算符应从流中读取一个值和一个单位字符,并将它们存入 Temperature 对象。

    两个运算符都必须返回流的引用,以便支持链式操作。

  • main.cpp:从输入中读取两个温度。每个温度单独占一行,格式为 value unit(例如,25.5 C)。

    创建两个 Temperature 对象,使用提取运算符从 std::cin 中读取它们。然后使用插入运算符按以下格式输出它们:

    Temperature 1: <temp1>
    Temperature 2: <temp2>

    例如,如果输入为:

    25.5 C
    98.6 F

    输出应为:

    Temperature 1: 25.5 C
    Temperature 2: 98.6 F

使用 <iomanip> 中的 std::fixed 和 std::setprecision(1) 将温度值格式化为恰好保留一位小数。别忘了在头文件中添加头文件保护。

亲手试试

#include <iostream>
#include "Temperature.h"

int main() {
    // TODO:创建两个 Temperature 对象
    
    // TODO:使用提取运算符(>>)从 std::cin 读取两个温度值
    
    // TODO:使用插入运算符(<<)输出温度值
    // 格式:
    // Temperature 1: <temp1>
    // Temperature 2: <temp2>
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C++ 在线编译器