目录
1.传统写法和现代写法
2.对于流提取的优化
3.简单机制了解
4.string类的几个构造函数总结
4.1基本用法
4.2两个赋值方式
4.3拷贝构造
4.4获取字符
4.5一个容易混淆的对比
4.6创建对象
1.传统写法和现代写法
(1)上面的代码里面的左边部分是现代的拷贝和赋值的写法,右边是完全我们自己实现的,这两者仅仅在代码的简洁度上面有所区别,其他的大体相同;
(2)现代的写法里面,我们使用的初始化列表进行初始化,调用swap函数进行这个交换同样也是可以达到这个拷贝构造的目的,实际上这个temp就是s3的拷贝,想要达到的效果就是s2和s3一样,这个swap实际上就是s2这个对象调用的;
(3)赋值函数的现代写法就更加简洁了,因为我们在进行赋值的时候,主要考虑的问题就是原来空间的释放问题,我们把原来的空间数据拷贝给s2之后,原来的空间要被释放掉,这个时候的temp也会因为执行析构函数达到空间释放的目的;
2.对于流提取的优化
(1)我们之前对于流提取,就是满了就开空间,不满的话就会一直向这个里面填充数据,满的话需要进行自动的扩容,但是我们优化的话,就会尽量减少这个扩容的空间;
(2)我们使用的方法就是定义一个数组buffer,先把这个数据存到buffer里面去,然后满了128之后再加到我们自己定义的形参s里面去,如果我们输入的字符串很长,就会128,128的往里面添加(每次满128之后就会把这个循环变量i重新置为0),如果我们输入的字符串很短,就会直接添加到buffer,然后加到s里面去;
(3)这样做的好处就是我们可以尽量减少这个capacity的大小,不是像之前那样二倍二倍的进行扩容;
3.简单机制了解
(1)就是浅拷贝的问题我们可以使用深拷贝的方式进行解决,但是如果我们不想开辟新的空间,就可以使用这个引用计数的方式进行解决,就是当浅拷贝,一个空间被多个指针指向的时候,我们就是用一个具体的数字进行计数,当这个引用计数的数字是0的时候,我们再把这个空间给释放掉
(2)另外一个浅拷贝的问题就是一个空间有多个指针指向,我们对于某个数据进行修改的时候,就会影响另外一个指向这个空间的指针变量,这个时候我们就可以使用写时拷贝技术,当我们需要对于这个数据进行修改的时候,我们再去进行深拷贝,这样的话就相当于延迟拷贝,需要时候我们再去执行深拷贝;
4.string类的几个构造函数总结
4.1基本用法
4.2两个赋值方式
下面的两个方式都是等效的,都是相当于对于这个字符串进行初始化赋值操作;
4.3拷贝构造
C++里面的string容器的拷贝构造都是深拷贝的,就是这个不在一块内存区域上面;
4.4获取字符
如果第二个参数比我们的字符串的长度小,我们就会截取指定长度的字符;
但是如果我们的长度比这个字符串更长,我们就会截取字符串全部内容,包括一些内存里面的随机存放的内容,他是不会达到这个斜杠0就自动停止的;
4.5一个容易混淆的对比
s3就是上面的实例里面的hello world字符串,3,3就是表示的从第三个下标位置开始,读取三个字符的内容;
s9是只给出来了第二个参数,我们这个时候就会直接读取到斜杠0才结束,并不会向上面的一样读取后面的随机内容;
但是如果我们把这个s3换为正式的字符串内容,我们感觉这个好像并没有影响,实际上这个输出的结果还是有一些差别的;
对于这个s11的内容,会按照上面的4.4里面的构造函数打印输出的,因为这个参数和4.4里面的构造函数更加接近;
4.6创建对象
这个构造函数里面是有两个参数,表示创建n个x字符的对象,n就是第一个参数,x就是我们创建的对象里面的字符;