C++ 流插入和流提取运算符的重载

开发 后端
要想流插入 << 运算符和流提取 >> 运算符能针对自定义的对象,那么我们就需要重载针对该对象的 ostream 类的 << 运算符 和 istream 的 >> 运算符,并且只能重载成全局的函数。

 — 1 —
<< 运算符的重载

C++ 在输出内容时,最常用的方式: 

  1. std::cout << 1 <<"hello"; 

提出问题:

  •  那这条语句为什么能成立呢?
  •  cout 是什么?为什么 << 运算符能用在 cout 上呢?

原因:

  •  实际上,cout 是在 iostream 头文件中定义的 ostream 类的对象。
  •  << 能够用在 cout 上是因为,在 ostream 类对 << 进行了重载。

对于如下这条语句: 

  1. std::cout << 1 <<"hello"; 

有可能按以下的方式重载成 ostream 类的成员函数: 

  1. ostream & ostream::operator<<(int n)  
  2.  
  3.     .... // 输出n整型的代码  
  4.     return *this;  
  5.  
  6. ostream & ostream::operator<<(const char * s)  
  7.  
  8.     .... // 输出s字符串的代码  
  9.     return *this;  

那么在使用流插入<<运算符时,等价于的形式如下:

01 数据类型是int类型时: 

  1. std::cout << 1

上面的语句,等价于: 

  1. cout.operator<<(1); 

02 数据类型是字符串类型时:

  1. std::cout << "hello"; 

上面的语句,等价于: 

  1. cout.operator<<("hello"); 

03 数据类型组合使用时: 

  1. std::cout << 1 <<"hello"; 

上面的语句,等价于: 

  1. ( cout.operator<<(1) ).operator<<("hello"); 

假定我们要想把某个对象里的内容进行打印输出,那么我们可以重载 ostream 类的流插入 << 运算符。

下面以 CStudent 类作为例子:

输出结果: 

  1. 1,20,小林coding 

需要注意: 

  1. ostream & operator<<(ostream & o, const CStudent & s) 

函数是全局的,所以函数的第一个参数必须要传入 ostream 的对象,并且 CStudent 类需要将此函数声明成友元函数,使得函数可以访问 CStudent 类的私有成员变量。

— 2 —

>> 运算符的重载

还是以 CStudent 类作为例子,假设想通过键盘的输入的内容,来初始化对象,则我们可以重载 istream 类的流提取 >> 运算符。

输入内容和输出内容: 

  1. // 输入内容:  
  2. 1,20,小林coding  
  3. // 输出内容:  
  4. 1,20,小林coding 

— 3 —

小结

要想流插入 << 运算符和流提取 >> 运算符能针对自定义的对象,那么我们就需要重载针对该对象的 ostream 类的 << 运算符 和 istream 的 >> 运算符,并且只能重载成全局的函数。

然后在 CStudent 类里需要把上面的两个重载函数声明成友元函数,使得两个重载的函数可以访问和赋值 CStudent 类里的私有成员函数。 

 

责任编辑:庞桂玉 来源: C语言与C++编程
相关推荐

2011-07-15 01:34:36

C++重载运算符

2024-01-26 16:37:47

C++运算符开发

2011-07-15 10:08:11

C++运算符重载

2009-08-12 10:47:03

C#运算符重载

2009-08-12 12:46:11

C#运算符重载

2020-09-30 14:04:25

C++运算符重载

2009-08-12 10:27:12

C#运算符重载运算符重载实例

2009-09-04 13:18:10

C#允许运算符重载

2009-08-12 10:56:47

C#运算符重载C#运算符重载实例

2009-08-14 10:16:57

C#运算符重载

2010-03-26 12:54:27

Python嵌入C++

2021-12-15 10:25:57

C++运算符重载

2009-08-12 11:20:51

C#运算符重载

2009-08-12 10:37:13

C#运算符重载

2021-06-07 06:10:22

C++While循环For 循环

2021-12-16 10:40:11

C++运算符重载

2009-08-11 15:51:08

C#运算符算术运算符

2022-09-19 08:10:37

运算符函数语言

2023-09-07 23:30:47

运算符C++

2009-08-12 15:20:18

C#赋值运算符复合赋值运算符
点赞
收藏

51CTO技术栈公众号