🌈string的本质
☀️1.string的由来:
以char为数据类型实例化模版basic_string为类类型basic_string,再将basic_stringtypedef为string:
☀️2.string是数据的容器,装载字符数据,本质上是字符数组。
☀️3.使用string这个类的话,需要包含头文件
☀️4.string的内部有非常多个成员函数:
(按首字母排序,这仅仅是冰山一角)
因此按照功能和效果将成员函数分为以下几类:默认成员函数、大小容量操作、元素访问、遍历字符串、插入删除、获取字符串、find系列。
也有几个重要的非成员函数。
下面一一介绍。
🌈一、默认成员函数
☀️1.string的构造函数(6个重载)
🎈(1)string()
用来构造空的string类对象,即空字符串
🎈(2)string(const string& str)
用一个字符串拷贝构造另一个字符串。
🎈(3)string(const string& str,size_t pos, size_t len = npos)
用来拷贝部分字符串。
以pos为起始位置,len为拷贝的长度,构造一个新字符串。
🌟len有一个默认值npos,代表什么?
- npos是一个静态const成员变量
- size_t是usigned int类型的(无符号类型),-1底层的补码全是1,size_t -1表示整型的最大值,即为2的32次方个字节,约为4G这么大
- 当len是整型最大值时,肯定超过了字符串长度
- npos是len参数的缺省值,实际表示:当没有传截止位置时,取到字符串末尾位置
- 注意,在使用该值时,要加上类域,即string::
🎈(4)string (const char* s)
用指针s指向的字符串构造另一个字符串。
注:被双引号括起来的常量字符串代表一个指针,指向该常量字符串的首元素。
🎈(5)string (const char* s, size_t n)
用指针s指向的字符串的前n个字符,构造另一个字符串。
注意和重载(3):string(const string& str,size_t pos, size_t len = npos)无第三个参数时区分,函数3的第一个参数为字符串的引用,而重载(5)的第一个参数是指向字符串的指针。
🎈(6)string (size_t n, char c);
将n个字符c构造一个字符串。
👻测试所有构造函数
#include<iostream>
#include<string>
using namespace std;
int main() {
string s0("Initial string");
string s1;//string();
string s2(s0);//string(const string& str);
string s3(s0, 8, 3);//string(const string& str,size_t pos,size_t len=npos);
string s4(s0, 8);//string(const string& str,int pos,int len=npos);
string s5("Hello world!");//string(const string* s);
string s6("Hello world!", 7);//string(const string* s,size_t n);
string s7(7, 'x');//string (size_t n, char c);
string s8(10, 42);// 42 is the ASCII code for '*'
cout << "s1:" << s1 << "\ns2:" << s2 << "\ns3:" << s3;
cout << "\ns4:" << s4 << "\ns5:" << s5 << "\ns6:" << s6;
cout << "\ns7:" << s7 << "\ns8:" << s8;
return 0;
}
☀️2.string的析构函数
自动调用,无需关注。
☀️3.赋值重载函数operator=(3个重载)
支持字符串本身、字符串地址、单个字符赋值:
🎈(1)string& operator= (const string& str)
将字符串str赋值给原字符串。
🎈(2)string& operator= (const char* s)
将指针s指向的字符串赋值给原字符串。
🎈(3)string& operator= (char c)
将单个字符c赋值给原字符串。
注:必须是将单个字符赋值给已经存在的字符串,如果在构造字符串的同时将单个字符赋值,编译器会认为你需要进行的操作是将单个字符隐式转换成字符串,则编译不会通过。
必须先构造空字符串s3,才能在s3的基础上使用operator=(char c)这一重载:
👻测试所有operator=函数
#include<iostream>
#include<string>
using namespace std;
int main() {
string s0("Test string");
string s1 = s0;//string& operator= (const string& str);
string s2 = "hello world!";//string& operator=(const string* s);
string s3;
s3 = 'x';
cout << "s1:" << s1 << "\ns2:" << s2 << "\ns3:" << s3;
return 0;
}
🌈二、大小、容量相关成员函数
注意:大小和容量是两个不同概念:
- 大小:实际存储的有效字符串大小,不包括’\0’
- 容量:底层为了存储字符串,而提前开辟好的一段空间
- 关系:大小<=容量,一旦大小容量相等,编译器底层会立马自动扩大容量
- size、length、clear、empty函数是和大小有关的;capacity、reserve、resize、shrink_to_fit函数是和容量有关的。其中resize函数在改变大小的同时也会使容量改变。
☀️有关字符串大小
🎈1.计算有效字符串长度:size、length
size和length函数用法完全相同。
👻测试:计算字符串大小
int main() {
string str("Test string");
cout << str.size()<<"\n";
cout << str.length();
}
🎈2.清空字符串、判断字符串是否为空:clear、empty
clear函数将字符串的内容清空:
empty函数只判断字符串是否为空字符,对字符串本身不做改动:
☀️有关底层容量
🎈1.计算容量大小:capacity
功能介绍:
-
返回当前为字符串分配的底层空间的大小,以字节表示。
(注意:字符串大小<=底层空间大小,只有先开辟了底空间,才能放得下字符串) -
这个容量不一定等于字符串长度。它可以相等或更大,当向字符串中添加新字符时,额外的空间就能允许对对象进行优化操作。
-
请注意,此容量不限制字符串的长度。当此容量用完并且需要更多容量时,它会由对象自动扩展(重新分配存储空间)。字符串长度的理论限制由成员max_size给定。
max_size给定的大小: