00后小哥哥,浅谈C++输入输出流及其重载

简介: 00后小哥哥,浅谈C++输入输出流及其重载

大家好,我是小熊,这篇文章来自你们最喜爱的00后小哥哥,自从发了几篇文章以后我的微信就被加爆了,竟然有女孩子想认识00后小哥哥!魅力那么大吗!!有没有考虑过小熊的感受?



aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDQtMjItMTM1MDU0LmpwZw.png

浅谈 C++输入输出流及其重载


在学习 C 阶段我们写代码第一句就是#include<stdio.h>,这个到底是什么呢?


include 称为文件包含命令,stdio 为 standard input output 的缩写,意为“标准输入输出”,是一个库,同样在 C++中也存在这样一个标准输入输出库#include,我们称之为标准输入输出流类库。


输入是将数据从输入设备传送到主机内存的过程,输出则是将数据从主机内存传送到输出设备的过程。数据像流水一样在主机和外存设备之间流动,我们形象称之为流。


重载输入/输出运算符


学习完 C 语言后,相信大家和我感受一样就是 C 语言语法要求很严格,用的时候规定很多。比如 scanf 和 printf 这两个函数在使用的时候如果我们制定的数据类型和输入的数据类型不一致的时候,就会出现很多错误。


但是我们在使用 C++的时候,我们不需要关心指定的输入数据类型,这得益于在 C++的(I/O stream)中,对于>>和<<这两个运算符进行了重载。


重载机制是 C++相对于 C 的很大一个改进,我们不需要想不同的名字来实现类似功能,并且我们可以通过重载>>和<<实现用户自定义的输入输出。

我们来看一段代码

class Date
{
private:
  int month;
  int day;
  int year;
public:
  Date(int m = 1,int d = 20,int y = 2020)//构造函数
  {
    month = m;
    day = d;
    year = y;
  }
};

我们创建了个日期类,如果我们现在想直接打印出来这个类的成员这是做不到的。

Date dt(4,22,2020);
  cout << dt;


但是我们如果对<<进行了重载就可以

friend ostream &operator<<(ostream& os, Date date);
ostream &operator<<(ostream& os, Date date)
{
  os << "date.month:"<<date.month << "date.day"<<date.day << "date.year"<<date.year;
  return os;
}

为什么重载为这个类的友元函数?因为运算符<<左边的操作数不是 Date 类型的的对象,是一个流。


友元问题可以看博客https://blog.csdn.net/flf1234567898/article/details/104824230


重载之后我们就可以直接 cout << dt;


再来看>>的重载

friend istream &operator>>(istream &in, Date &dt);
istream &operator>>(istream &in, Date &date)
{
  cout << "day month year" << endl;
  in >> date.day >> date.month >> date.year;
}


这样我们就能直接输入输出对象了


Date dt;//创建对象
  cin >> dt;
  cout << dt << endl;


这样我们就完成了这个 Date 类的输入输出重载,通过重载机制,我们可以大量减少代码量并且方便许多,聪明的你是否学会了呢?

相关文章
|
5月前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
47 1
|
2月前
|
C++
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
4月前
|
NoSQL 编译器 Redis
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
|
4月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
|
5月前
|
安全 程序员 C++
C++一分钟之-重载运算符
【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
45 2
|
5月前
|
C++
C++函数的默认参数、占位符、重载
C++函数的默认参数、占位符、重载
|
5月前
|
Unix 编译器 C语言
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
27 0
|
6月前
|
程序员 编译器 C++
c++重载运算符和重载函数
c++重载运算符和重载函数
35 1
|
5月前
|
编译器 C++
C++运算符的重载
C++运算符的重载
28 0