认识C++string类

简介: 认识C++string类

0.前言:


 书接上回,C++中用字符数组来存储字符串在C语言中很常见。请看上回分解链接。


 这次我们就来讲C没有的,用string类变量来存储字符串。文章若有更好的排版、或有错误、或内容排布有问题,希望各位读者指出,博主第一时间改正。


1.string类变量


1.1string类介绍

 string类是在ISO/ANSI C++98标准通过后添加到C++类库中的,因此我们可以使用string类创建变量来存放字符串,而不是使用字符数组。string类的头文件是<string>,名称空间在std中。


1.2string类变量与字符数组的比较

 最初,我们用string类创建了变量str,没有进行初始化,str的长度是0,也用字符串常量给类变量赋值。然后我们使用输入对象cin为str输入字符串,还用cout对str的内容进行输出。总结来说就是:


对字符数组和类的操作

功能/对象

str

arr

使用C-风格字符串来初始化

可以 可以

使用cin输入字符串来赋值

可以 可以

使用数组下标的方式访问

可以 可以

使用cout显示内容

可以 可以

 提一嘴数组下标形式来访问类的元素,我这个们看到代码str[2],我们知道,str是一个类创建出来的变量,一个变量怎么能有下标呢,更别提用下标来访问元素了,其实这是因为,string类隐藏了字符串的数组性质,让我们使用的是一个普通变量,实际上是有内部操作的,待会的代码就会让你对类有更清晰一点的了解。


1.3string类变量初始化

 string类变量的初始化也和有遵从C++11等新方式,比如单值变量用{}列表初始化,''=''可以省略,size是用来计算str的长度的和C语言用strlen来求字符串长度一样,看到str.size为0我们就能理解没有初始化的时候,创建一个长度为0的string对象了,对比str3用{}来初始化,显示出来也一样,这说明什么呢?我们知道在创建数组的时候int arr[10]{};的意思是初始化10个整型元素为0,所以其实str和str3都应该是被初始化为'\0'了。


1.4string类变量的操作


1. 变量可以赋值给变量这是毋庸置疑的,但当我们看向变量的内容时,发现变量的内容是字符串,我们知道,以往字符串存放在字符数组中,字符数组不能相互赋值,而是需要通过strcpy拷贝一个字符串到另一个字符串来实现,其实类就是这样的一种存在,类既说明了表示的数据,也定义了对数据的操作,你可以这么理解,当两个类,str1 = str2的时候,编译器就知道它要拷贝,在内部定义的拷贝就动用了,这得益于类的强大和智能。

2.字符串的合并,两个类字符串可以通过运算符+来实现字符串的合并,并赋值给str3。

3.字符串的追加,与C语言里的strcat类型的实现。

我们加上打印的来看一下:


 这样可以理解的更深刻一些。


1.5强化训练string类变量的操作

 把这段代码给理解了,就差不多啦(doge),举例子而已哈(bush)。


1.6字符数组对应的类操作

 处理string对象的语法通常比C字符串函数简单。


 补充:假如我们在追加charr1的时候,目的地的空间不够就会造成数组外的数据被破坏,导致程序终止,而string类具有自动调整大小的功能,可以避免。如果我们使用strncat()的话,又有点复杂,增加了编写的难度,所以其实类变量是更有优势的。


2.string类I/O


2.1string类的输入输出

 用cin对string类的输入和字符数组的输入是一样的,cin>>str;cin>>arr;不一样的是读取一行字符串的时候string类的句法是getline(cin, str);


 charr没输入之前是23的长度为什么呢,明明数组只有10的空间大小,这是因为没有初始化,是随机值,只有遇到\0才停止计算长度,而str虽然没有初始化,长度为0的原因是string对象的长度被自动设置位0,并根据你为对象输入的字符串大小而随时调整。


 geline(cin, str)没有使用.(点),这说明getline()在这里不是一个类方法,它将cin作为参数,指出到哪里去查输入。那为什么一个getline()是istream的类方法,另一个不是呢,这是因为在引入string类之前就有了getline()了,当时getline()在设计的时候考虑到了诸如double和int等基本类型,但没有考虑string类型,那你可能会问,没有处理string对象的类的方法,cin>>str是如何实现的呢?这是因为在处理string对象的代码使用的是string类的一个友元函数,另外我们可以是cin和cout于string对象而不用考虑如何实现的。


2.2其它形式的字符串字面值


 除char类型外,C++还有类型wchar_t, C++11又增加了char16_t和char32_t,可以创建这些类型的字符常量和字符串字面值。C++分别使用前缀L,u,U来表示对应的类型的字符常量或字符串字面值。

这些还在发展中!通用字符名与上面的char16_t和char32_t有联系。


2.3原始字符串

 当我们想cout出"的时候,可不可以不要用\"转义序列来输出,因外那样将会把一个输出字符串增加得很难看或难懂。答案是有的,通过原始(raw)字符串来实现。


 原始字符串:在原始字符串中,字符表示的就是字符本身,例如,\n在原始字符串中不是换行的意思,就是\和n字符,"也是一个字符,可以放在字符串字面值里,因此,就不能再使用它来表示字符串的开头和结尾,而是将"(和)"用做界定符,并使用前缀R来标识原始字符串。


 假如我们在原始字符串中包含)",该怎么做?我们用R"(来表示原始字符串的开始,当编译器遇到第一个")时,会不会认为是字符串的结束呢,无疑是会的,和C的注释一样,不能嵌套,其实我们可以在"与(间添加其它字符,这意味着表示字符串结尾的时候也要在)和"间添上字符才能结尾。


ok啦,终于讲完字符串复合类型啦!


希望你看完有所收获,求点赞,求点赞,求点赞!


你的点赞是我更新的动力,一起加油!

相关文章
|
1月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
72 5
|
1月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
51 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
108 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
98 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
123 4
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
70 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
56 2
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
32 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
33 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
29 1