首页 > 编程笔记

C++重载>>和<<(重载输入和输出运算符)

默认情况下,借助 cin 和 >> 运算符只能对 C++ 内置类型(例如 bool、int、double 等)的数据做输入操作,同样地,借助 cout 和 << 运算符只能输出 C++ 内置类型的数据。

为了让大多数运算符也适用于自定义的数据类型,C++ 允许开发者赋予运算符新的含义,这个过程就叫做运算符重载。

接下来,给读者讲解重载 << 和 >> 运算符的方法,它们在C++标准库中主要用于输出和输入操作。

重载<<输出运算符

当需要输出自定义类型的数据或者类对象时,可以对 << 输出运算符进行重载,语法格式如下:
ostream & operator<<(ostream& out, const 自定义类型 & obj){
    // 自定义输出格式
    // out << ...
    return out;
}
operator<<() 就是 << 输出运算符重载函数,它有两个参数:
因为要保证 cout 连续输出的特性(cout<<...<<...<<...),所以返回了一个 ostream 对象的引用。

重载>>输入运算符

输入运算符的重载与输出运算符类似,语法格式如下:
istream& operator>>(istream& in, 自定义类型 & obj){
    // 自定义输入格式
    // in>>...
    return in;
}
第一个形参是输入流的引用,第二个形参是要输入的对象,最后返回一个输入流的引用。

在输入的时候,因为要改变 obj 对象,所以不能像输出那样将它定义为 const 的引用。

实例演示

下面的实例通过一个 Person 类来演示重载 << 和 >> 的方法。
#include <iostream>
#include <string>
using namespace std;

class Person {
public:
    Person(string n, int a) : name(n), age(a) {}

    // 重载<<运算符
    friend ostream& operator<<(ostream& os, const Person& p);

    // 重载>>运算符
    friend istream& operator>>(istream& is, Person& p);

private:
    string name;
    int age;
};

// 实现<<运算符重载
ostream& operator<<(ostream& os, const Person& p) {
    os << "Name: " << p.name << ", Age: " << p.age;
    return os;
}

// 实现>>运算符重载
istream& operator>>(istream& is, Person& p) {
    cout << "Enter name: ";
    is >> p.name;
    cout << "Enter age: ";
    is >> p.age;
    return is;
}

int main() {
    Person p1("Alice", 30);
    cout << p1 << endl;  // 输出:Name: Alice, Age: 30

    Person p2("", 0);
    cin >> p2;           // 输入:Bob 40
    cout << p2 << endl;  // 输出:Name: Bob, Age: 40

    return 0;
}
运行结果为:

Name: Alice, Age: 30
Enter name: Bob 40
Enter age: Name: Bob, Age: 40

在这个示例中,我们定义了两个友元函数,分别用于重载 << 和 >> 运算符。通过重载,我们能够以自然和简洁的方式进行输入和输出操作。

实例程序中是以全局函数的方式重载 << 和 >> 的,事实上也只能以这种方式重载,而不能以成员函数的方式重载,因为后者要对 istream 类和 ostream 类进行修改,而它们都属于标准库中的类,是不可以修改的。

推荐阅读