C++重载>>和<<(重载输入和输出运算符)
默认情况下,借助 cin 和 >> 运算符只能对 C++ 内置类型(例如 bool、int、double 等)的数据做输入操作,同样地,借助 cout 和 << 运算符只能输出 C++ 内置类型的数据。
为了让大多数运算符也适用于自定义的数据类型,C++ 允许开发者赋予运算符新的含义,这个过程就叫做运算符重载。
接下来,给读者讲解重载 << 和 >> 运算符的方法,它们在C++标准库中主要用于输出和输入操作。
因为要保证 cout 连续输出的特性(cout<<...<<...<<...),所以返回了一个 ostream 对象的引用。
在输入的时候,因为要改变 obj 对象,所以不能像输出那样将它定义为 const 的引用。
实例程序中是以全局函数的方式重载 << 和 >> 的,事实上也只能以这种方式重载,而不能以成员函数的方式重载,因为后者要对 istream 类和 ostream 类进行修改,而它们都属于标准库中的类,是不可以修改的。
为了让大多数运算符也适用于自定义的数据类型,C++ 允许开发者赋予运算符新的含义,这个过程就叫做运算符重载。
接下来,给读者讲解重载 << 和 >> 运算符的方法,它们在C++标准库中主要用于输出和输入操作。
重载<<输出运算符
当需要输出自定义类型的数据或者类对象时,可以对 << 输出运算符进行重载,语法格式如下:ostream & operator<<(ostream& out, const 自定义类型 & obj){ // 自定义输出格式 // out << ... return out; }operator<<() 就是 << 输出运算符重载函数,它有两个参数:
- ostream &:不能用 const 修饰,因为写入到流会改变流的状态;此外,这个形参必须是引用形式,因为 ostream 类没有拷贝构造函数。
- const 自定义类型 &:要输出的对象,这里定义为引用是为了避免复制对象,由于一般的输出过程不会对类对象做修改,并且定义为 const 可以同时输出 const 对象和非 const 对象,一举二得。
因为要保证 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 类进行修改,而它们都属于标准库中的类,是不可以修改的。