一、运算符基础认知
1.1 基本定义
-
<< (流插入运算符)
将数据从变量传输到输出流(如cout
、文件流) -
>> (流提取运算符)
将数据从输入流(如cin
、文件流)传输到变量
1.2 标准用法示例
#include <iostream>
using namespace std;
int main() {
int age;
double salary;
// 输入链式调用
cout << "Enter age and salary: ";
cin >> age >> salary; // 注意输入顺序
// 输出混合类型
cout << "Age: " << age
<< ", Salary: $" << salary << endl;
return 0;
}
二、运算符重载机制
2.1 内置类型支持
C++标准库已为基本类型提供重载:
// 典型函数原型
ostream& operator<<(ostream&, int);
istream& operator>>(istream&, double&);
2.2 自定义类型重载步骤
以日期类为例:
class Date {
int year, month, day;
public:
// 友元声明
friend ostream& operator<<(ostream& os, const Date& d);
friend istream& operator>>(istream& is, Date& d);
};
// 输出重载实现
ostream& operator<<(ostream& os, const Date& d) {
os << d.year << "-"
<< d.month << "-"
<< d.day;
return os;
}
// 输入重载实现(带校验)
istream& operator>>(istream& is, Date& d) {
char dash1, dash2;
is >> d.year >> dash1 >> d.month >> dash2 >> d.day;
if(dash1 != '-' || dash2 != '-' || d.month > 12) {
is.setstate(ios::failbit); // 标记错误状态
}
return is;
}
三、关键特性解析
3.1 运算符返回值
- 返回流对象的引用,实现链式调用
(cout << "Result: ") << 42 << endl;
3.2 类型安全机制
- 自动识别数据类型,编译时检查类型兼容性
string s;
cin >> s; // 正确
cout << s; // 正确
Date d;
cin >> d; // 需要自定义重载
3.3 错误处理模式
int num;
if (cin >> num) { // 检测流状态
// 输入成功
} else {
cin.clear(); // 清除错误标志
cin.ignore(1000, '\n'); // 清空缓冲区
}
四、常见问题解决方案
4.1 输入残留换行符
int age;
string name;
cin >> age;
cin.ignore(); // 清除回车
getline(cin, name); // 正确读取完整行
4.2 混合输入处理
char ch;
int val;
// 安全读取模式
cin >> ws; // 跳过空白字符
cin >> ch;
cin >> val;
五、运算符重载最佳实践
- 保持一致性:成对实现<<和>>
- 避免修改流状态:除输入校验外不改变流配置
- 处理所有数据成员:确保完整序列化
- 添加错误检查:特别是输入操作
对比总结
特性 | operator<< | operator>> |
---|---|---|
操作方向 | 变量 → 流 | 流 → 变量 |
参数类型 | 常量引用 | 非常量引用 |
典型应用 | 调试输出、日志记录 | 用户输入、数据反序列化 |
错误处理 | 通常无需处理 | 必须检查流状态 |