📜  重载 IO 流 - C++ (1)

📅  最后修改于: 2023-12-03 15:12:31.843000             🧑  作者: Mango

重载 IO 流 - C++

在 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_namem_age,以及相应的访问成员变量的函数。我们分别对输出流和输入流进行重载,以支持以 Person 类型为参数的输入和输出操作。在主函数中,我们创建了两个 Person 类型的对象,并将它们输出到控制台上,然后通过输入流来读取一个 Person 类型的对象,并输出到控制台上,演示了如何使用 IO 流重载来实现这些操作。