流运算符
本课属于 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挑战
简单让我们构建一个 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;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C++ 在线编译器