C++ string介绍

本文详细介绍了C++中string类的相关知识。首先阐述了string的本质是字符数组,使用需包含头文件。接着按功能分类介绍了其成员函数,如默认成员函数、大小容量操作、元素访问、遍历、插入删除、获取字符串、find系列等,还介绍了几个重要的非成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🌈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,代表什么?

在这里插入图片描述

  1. npos是一个静态const成员变量
  2. size_t是usigned int类型的(无符号类型),-1底层的补码全是1,size_t -1表示整型的最大值,即为2的32次方个字节,约为4G这么大
  3. 当len是整型最大值时,肯定超过了字符串长度
  4. npos是len参数的缺省值,实际表示:当没有传截止位置时,取到字符串末尾位置
  5. 注意,在使用该值时,要加上类域,即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;
}

在这里插入图片描述

🌈二、大小、容量相关成员函数

在这里插入图片描述

注意:大小和容量是两个不同概念:

  1. 大小:实际存储的有效字符串大小,不包括’\0’
  2. 容量:底层为了存储字符串,而提前开辟好的一段空间
  3. 关系:大小<=容量,一旦大小容量相等,编译器底层会立马自动扩大容量
  4. 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

在这里插入图片描述
功能介绍:

  1. 返回当前为字符串分配的底层空间的大小,以字节表示。
    (注意:字符串大小<=底层空间大小,只有先开辟了底空间,才能放得下字符串)

  2. 这个容量不一定等于字符串长度。它可以相等或更大,当向字符串中添加新字符时,额外的空间就能允许对对象进行优化操作。

  3. 请注意,此容量不限制字符串的长度。当此容量用完并且需要更多容量时,它会由对象自动扩展(重新分配存储空间)。字符串长度的理论限制由成员max_size给定。
    max_size给定的大小:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值