9.3 插入符和提取符的重载
C++语言的I/O流库具有很大的灵活性,允许用户通过重载插入符(<<
)和提取符(>>
)来支持新的数据类型。这样可以使自定义的数据类型像内置类型一样方便地进行输入和输出操作。
示例:重载插入符和提取符处理日期类型
我们通过一个例子来讲述如何重载插入符和提取符以处理按中国习惯表示的日期。
程序示例
#include <iostream>
using namespace std;
class Date {
public:
Date(int y, int m, int d) : Year(y), Month(m), Day(d) {}
friend ostream& operator<<(ostream &stream, Date &date);
friend istream& operator>>(istream &stream, Date &date);
private:
int Year, Month, Day;
};
ostream& operator<<(ostream &stream, Date &date) {
stream << date.Year << "/" << date.Month << "/" << date.Day << endl;
return stream;
}
istream& operator>>(istream &stream, Date &date) {
stream >> date.Year >> date.Month >> date.Day;
return stream;
}
int main() {
Date CDate(1998, 8, 17);
cout << "Current date: " << CDate << endl;
cout << "Enter new date: ";
cin >> CDate;
cout << "New date: " << CDate << endl;
return 0;
}
输出结果:
Current date: 1998/8/17
Enter new date: 1998 8 18
New date: 1998/8/18
说明
在这个例子中,通过定义友元函数重载了插入符和提取符,使得 Date
类对象可以像内置类型一样进行输入和输出操作。重载插入符时使用了 ostream
类,因为 cout
是该类的对象。重载提取符时使用了 istream
类,因为 cin
是该类的对象。友元函数的使用使得重载函数可以访问 Date
类的私有成员。
示例:重载插入符和提取符处理复数类型
我们再通过一个例子来展示如何重载插入符和提取符以处理复数类型。
程序示例
#include <iostream>
using namespace std;
class Complex {
public:
Complex() : real(0.0), imag(0.0) {}
Complex(double a, double b) : real(a), imag(b) {}
friend Complex operator+(const Complex &c1, const Complex &c2);
friend ostream& operator<<(ostream &stream, const Complex &c);
friend istream& operator>>(istream &stream, Complex &c);
private:
double real, imag;
};
Complex operator+(const Complex &c1, const Complex &c2) {
double r = c1.real + c2.real;
double i = c1.imag + c2.imag;
return Complex(r, i);
}
ostream& operator<<(ostream &stream, const Complex &c) {
stream << "(" << c.real << ", " << c.imag << ")";
return stream;
}
istream& operator>>(istream &stream, Complex &c) {
stream >> c.real >> c.imag;
return stream;
}
int main() {
Complex x, y, z;
cout << "Input two complex numbers:\n";
cin >> x >> y;
z = x + y;
cout << z << endl;
return 0;
}
输出结果:
Input two complex numbers:
5 9
23 46
(28, 55)
说明
在这个例子中,通过定义友元函数重载了插入符和提取符,使得 Complex
类对象可以进行输入和输出操作。输入格式定义为 <实部> <虚部>
,输出格式定义为 (<实部>, <虚部>)
。用户可以根据需要自定义输入和输出格式,例如将输出格式定义为 <实部> + <虚部>i
。
结论
重载插入符和提取符是C++语言的一个重要特性,它使得自定义的数据类型可以像内置类型一样方便地进行输入和输出操作。这种机制极大地增强了编程的灵活性和可扩展性。通过友元函数的使用,重载函数可以访问类的私有成员,从而实现更复杂的数据操作。希望本文对重载插入符和提取符的理解有所帮助,为编写更灵活、更易维护的C++程序提供支持。