文章目录
- 1.string
- 1.1string的几种初始化方式
- 2.auto关键字
- 3.string类对象的几种修改操作
- 4.string类非成员函数
- 5.拷贝
- 5.1浅拷贝
- 5.2深拷贝
- 5.3写时拷贝
1.string
在使用string类时,必须包含
#include <string>头文件以及using namespace std;
1.1string的几种初始化方式
- s1: 默认构造
- s2:用C字符串初始化
- s3:拷贝构造
- s4:子串构造
- s5:子串构造(只给起始位置)
- s6:从C字符串取前n个字符
- s7:重复字符构造
string s1; string s2("hello world"); string s3(s2); string s4(s2, 6, 1000);//第二个参数是起始位置,第三个参数是长度 如果长度超过了字符串的长度,则取到字符串的末尾 const string s5(s2, 6);//不传第三个参数,默认取到字符串的末尾 string s6("hello world", 5); string s7(5, 'n'); cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4 << endl; cout << s5 << endl; cout << s6 << endl; cout << s7 << endl; cout << "****************" << endl;代码结果:
hello world hello world world world hello nnnnn ****************2.auto关键字
- 在早期C/C++中
auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。在C++11中,标准委员会变废为宝赋予auto全新的含义即:auto不再试一个存储类型指示符了,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。- 用
auto来声明指针类型时候,auto和auto*没有任何区别,但是用auto声明引用类型时则必须加&。- 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
auto不能作为函数的参数,可以做返回值,但是这种做法建议谨慎使用。auto不能直接用来声明数组。
3.string类对象的几种修改操作
push_back():在字符串后面尾插一个字符。append():在字符串后追加一个字符串。operator+=在字符串后追加字符串。c_str()返回C格式字符串。substr()在str中从pos位置开始,截取n个字符,然后将其返回。
4.string类非成员函数
operator+:传值拷贝会导致低效率。operator<<:输出运算符重载。operator>>:输入运算符重载。getline:获取一行字符串(直至遇到换行符才停止获取)relational operators:大小比较
5.拷贝
5.1浅拷贝
也称为位拷贝,编译器只是将对象中的值拷贝过来,如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而让另一些对象不知道资源已经释放掉,对该资源进行访问的时候就会报错。
5.2深拷贝
为了避免浅拷贝可能出现的问题,深拷贝使每一个对象都有一份独立的资源,不需要和其他对象共享。一般适用于类中资源的管理,包括其拷贝构造函数,赋值运算符重载以及构造函数必须要显式给出。
5.3写时拷贝
写实拷贝是在浅拷贝的基础上增加引用技术的方式来实现的,其意向也和深拷贝一样防止浅拷贝可能出现的越界问题,引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该 资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源, 如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有 其他对象在使用该资源。