文章目录
3.2 标准库类型string
标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.string定义在命名空间std中.
#include<iostream>
using std::string;
3.2.1 定义和初始化string对象
string s1; //默认初始化,S1是一个空字符串
string s2 = s1; //s2是s1的副本
string s3 = "hiya"; //s3是该字符串字面值的副本
string s4(10,'c'); //s4的内容是cccccccccc
直接初始化和拷贝初始化
如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新建的对象中去.与之相反,如果不使用等号,则执行的是直接初始化.
当初始值只有一个是,哪种初始化都可以.如果初始化要用到的值有多个,一般来说只能使用直接初始化.
string s5 = "hiya";//拷贝
string s6("hiya"); //直接
string s7(10,'c'); //直接
对于用多个值进行初始化的情况,如果用拷贝初始化的方式来处理,需要显式地创建一个(临时)对象用于拷贝:
string s8 = string(10,'c');
尽管初始化s8的语句合法,但跟初始化s7的方式比较起来可读性较差,也没有任何补偿优势
3.2.2 string对象上的操作
读取未知数量的string对象
使用getline读取一整行
触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符
string的empty和size操作
empty函数根据string对象是否为空返回一个对应的布尔值.
size函数返回string对象的长度(即string对象中字符的个数)
string::size_type类型
size函数返回的是一个string::size_type类型的值.它是一个无符号类型的值而且能足够放下任何string对象的大小.所有存放string类的size函数返回值的变量,都应该是string::size_type类型的.
由于size函数返回的是一个无符号整型数,如果在表达式中混用了带符号数和无符号数将可能产生意向不到的结果
如果一条表达式中已经有了size()函数就不要在使用int了,这样可以避免混用int和unsigned可能带来的问题
比较string对象
- 如果两个string对象的长度不同,而且较短string对象的每个字符都与较长string对象对应位置上的字符相同,就说较短string对象小于较长string对象
- 如果两个string对象在某些对应的位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果
为string对象赋值
对于string类而言,允许把一个对象的值赋给另外一个对象:
string st1(10.'c'), st2;
st1 = st2;
两个string对象相加
两个string对象相加是把左侧的运算对象与右侧的运算对象串接而成.
string s1 = "hello,", s2 = "world\n";
string s3 = s1 + s2;//s3的内容是 hello,world\n
字面值和string对象相加
标准库允许把字符字面值和字符串字面值转换成string对象.
当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string
因为某些历史原因,也为了与c兼容,所以c++语言中的字符串字面值并不是标准库类型string的对象.
3.2.3 处理string对象中的字符
处理每个字符?使用基于范围的for语句
范围for语句可以遍历给定序列中的每个元素并对序列中的每个值执行某种操作
for(declaration : expression)
statement
其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。