9.3 插入符和提取符的重载

 

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++程序提供支持。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值