再次学习C++基础感想(六)

1.多态性

一提到这个多态性,我们能够想到的往往是类里面的多态性,但是C++里面其实还有静态多态性。也就是我么前面学过的函数重载和运算符重载,这两种属于静态多态性,之所以是静态多态性,在程序编译时,系统就能决定调用的是哪个函数,又称编译时的多态性。
与之对应的是,动态多态性,这个就是说要在程序运行的时候才可以确定具体调用哪个函数。这就是一个很好的功能,还记得前面提到的虚基类吗?虚基类在那里的时候,我们解决了数据重复的问题,但是指向子类的父类指针只能访问到子类中从父类继承下来的部分信息,对于子类新增加的信息无法访问,这里这个动态多态性就可以解决这个问题。具体的做法就是在基类里面声明函数为虚函数,就是在返回值前面加上virtual关键字,注意!在类外定义函数体的时候就不要再加virtual了。虚函数的作用是允许在派生类中对基类的虚函数重新定义(即函数覆盖),只能用于类的继承层次结构中

2.虚析构函数

今天在这里算是可以理解这个虚析构函数了!如下图所示,如果这里的~Point()函数没有定义为virtual的,我们在delete p的时候,就只会执行一个Point类的析构函数,而不会执行Circle子类的析构函数。
在这里插入图片描述

这里图中的蓝色的部分写的意思是,这里的Circle子类的虚函数也默认是虚函数,这里没写也是,就算名字不一样也是。
在这里插入图片描述

3.纯虚函数

有纯虚函数的类是抽象类,不可以定义对象,只用来被继承,所以一般顶层基类多为抽象类,里面有纯虚函数。纯虚函数是对前面提到的虚函数的升级版,它对应的是无函数体的虚函数。

4.输入输出流

类的继承关系图:
在这里插入图片描述

常用的头文件,下次不用找了。哈哈哈
在这里插入图片描述

输出流有三个:cout cerr clog
cout先输出到缓冲区,后输出到文件或显示器。cerr不经过缓冲区,且只输出到显示器。clog先输出到缓冲区,后输出到显示器。
标准输入流:cin对象。关于cin对象,有以下几个Tips。
在这里插入图片描述

后面的这个while(cin>>grade)这句话,可以用于输入数据不确定个数的时候的情况。

5.如何控制输出格式

在这里插入图片描述

6.输入流的几个重要函数,也就是控制输入的格式

1.get()函数,用于输入一个字符。这个函数有多种重载的形式,这里只列举了三种。
在这里插入图片描述

2.getline()函数用于输入一行的数据。它的返回值是一个输入流的引用。这里要注意,getline()函数在输入的时候,即使遇到了空白字符也不结束,只会在有参数时遇到函数参数指定的字符,或者无参数时遇到换行符结束,普通的cin对象在遇到空白字符的时候就结束了。
在这里插入图片描述

3.还有一些其他的常用函数,(个人觉得在这一部分里面,熟悉为主,下次用的时候,记得有这个东西就可以了。)
在这里插入图片描述

这里的这个例子里面使用了peek()函数和putback()函数,这里首先是getline()函数的使用,遇到了’/‘结束,然后是peek()函数,取出指针当前指向的字符,注意指针未移动到下一位,只是取出。然后是putback()函数,这里是将第一个字符插入到了’W’的前面,然后继续使用getline()函数,接着就是很有意思的一个现象,我们输出了第二个部分,也就是’/'后面的部分,但是我们getline()函数参数里面的15却是对于到目前为止的所有输入的限制。就很神奇。

7.文件流与文件

文件是文件,就是我们计算机把硬盘里面的存储区域抽象成了文件。文件流是一种流,它的输入输出是文件,所以是文件流,换句话说,还有别的很多流,这种叫文件流。对文件的操作需要流对象,cout和cin是常见的已经定义好的流对象。打开磁盘文件分为两步,第一步,要先建立关联,然后还要指定打开的方式,这分别是两个参数。
在这里插入图片描述

第一个参数是建立关联,可以是使用相对路径,也可以是使用绝对路径,这是C++里面常用的方法。第二个参数是打开方式,这个就有很多了。一一来看。
在这里插入图片描述

二进制文件

C++默认的输出的是文本文件,数字在文本文件里面是按照ASCII码存储的,但是在内存里面是按照二进制存储的,但是对于字符,在内存和硬盘里面都是按照ASCII码存储的。都一样。
数据流是以字节为单位的。所以,我们首先打开之后,要设置以二进制形式打开,然后调用read()和write()函数,第一个参数是指向字符的指针,因为字符占用一个字节,正好和数据流的单位一样。
在这里插入图片描述

随机读写

我们一般在操作文件的时候,指向文件当前读写位置的指针是会随着操作的进行慢慢移到后面去的,那么,如果我们要移动这个指针,就需要使用一些函数,这就叫做随机读写。
在这里插入图片描述

8.字符串流

还记得前面学习文件流用到的这个图吗?
在这里插入图片描述

我们这里的字符串流也是继承自iostream的,它的头文件是strstream.字符串流表示的是内存中的一块区域。我们来细细说道,流是以字节为单位的,又因为一个字符也是一个字节,因此,我们称内存中的流为字符串流,另外,还因为我们输入的数据到内存里面都会转换为二进制,按照一个一个字节来存储,也可以这么解释字符串流。接下来是关于字符串流的一些应用,举几个例子:
这个是我们定义了一个strout1这个用于输出的字符串流对象,然后我们在第一个for循环里面把stud结构体里面的数据输出到strout1里面来了。如果这里直接是cout的话,那么是把这些数据直接输出到控制台,这里换成了输出字符串流对象就是直输出到strout1,也就是内存里面。接着又把ends输出到内存里面来了,这个符号相当于’\0’,用于表示字符串的结束。这里的这个例子我么知道了用ostrstream对象可以表示内存中的某一块区域。
在这里插入图片描述

在这里插入图片描述

接下来是这第二个例子,在这个例子里面,我们要实现的是对数组排序,我们输入的是数组c是一个字符串组,这个数组c是存储到内存里面的,我们把它和一个输入字符串流对象strin联系到一起,这时候再把它输入到一个整形数组a里面去,此时,我们就可以对数组a进行排序,然后把排序号的数组,输出到一个输出字符串流对象strout,这就可以了。那么,问题来了?这个字符串流有什么用呢?不知道大家,通过看刚才的代码有没有发现,它特别适合把以ASCII形式表示的数组c转换为以二进制表示的数组a.

欢迎关注我的微信公众号,获得更多的资源。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针的值是地址

觉得还不错,我会继续努力的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值