📅  最后修改于: 2023-12-03 15:12:31.843000             🧑  作者: Mango
在 C++ 中,我们可以对输入流(istream
)和输出流(ostream
)进行重载,使得输入和输出数据类型不限于常规的整型、浮点型和字符型等。通过重载 <<
和 >>
运算符,我们可以将自定义类型的对象输入到流中或从流中输出对象,这种方法也被称为 IO 流的重载。本文将介绍如何对 IO 流进行重载,以及重载 IO 流的一些技巧和注意事项。
对输出流进行重载,可以使用以下代码:
ostream & operator << (ostream & os, const MyType & obj) {
os << obj.data;
return os;
}
其中,第一个参数 os
是输出流对象的引用,第二个参数 obj
是要输出的自定义类型的对象的引用。在函数体内,我们将自定义类型的对象的数据成员输出到流中,并返回输出流对象的引用。
这里需要注意的是,我们将第二个参数设为 const
类型,这是因为我们只是想把对象的数据成员输出到流中,并不想修改对象的值。如果希望修改对象的值,我们可以将第二个参数的类型设置为非 const
类型。
另外,需要注意的是,我们返回的是输出流对象的引用,这是因为我们想要支持连续的输出,例如:
MyType obj1, obj2;
cout << obj1 << obj2 << endl;
对输入流进行重载,可以使用以下代码:
istream & operator >> (istream & is, MyType & obj) {
is >> obj.data;
return is;
}
其中,第一个参数 is
是输入流对象的引用,第二个参数 obj
是要输入数据的自定义类型的对象的引用。在函数体内,我们从输入流中读取数据,并将数据赋值给自定义类型的对象的数据成员,并返回输入流对象的引用。
需要注意的是,我们将第二个参数的类型设置为非 const
类型,这是因为我们需要修改对象的值。另外,我们同样返回输入流对象的引用,以支持连续输入。
下面给出一个完整的示例代码,演示如何对一个自定义类型(Person
)进行 IO 流的重载:
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
Person(string name, int age) : m_name(name), m_age(age) {}
void SetName(const string & name) { m_name = name; }
string GetName() const { return m_name; }
void SetAge(int age) { m_age = age; }
int GetAge() const { return m_age; }
private:
string m_name;
int m_age;
};
ostream & operator << (ostream & os, const Person & obj) {
os << "Name: " << obj.GetName() << ", Age: " << obj.GetAge();
return os;
}
istream & operator >> (istream & is, Person & obj) {
string name;
int age;
is >> name >> age;
obj.SetName(name);
obj.SetAge(age);
return is;
}
int main() {
Person p1("Alice", 23), p2("Bob", 25);
cout << p1 << endl;
cout << p2 << endl;
cout << "Please input the name and age of a person: ";
cin >> p1;
cout << p1 << endl;
return 0;
}
上述代码中,我们定义了一个 Person
类,包含成员变量 m_name
和 m_age
,以及相应的访问成员变量的函数。我们分别对输出流和输入流进行重载,以支持以 Person
类型为参数的输入和输出操作。在主函数中,我们创建了两个 Person
类型的对象,并将它们输出到控制台上,然后通过输入流来读取一个 Person
类型的对象,并输出到控制台上,演示了如何使用 IO 流重载来实现这些操作。