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 类进行修改,而它们都属于标准库中的类,是不可以修改的。
ICP备案:
公安联网备案: