type
status
date
slug
summary
tags
category
icon
password
Property
string
表示可变长度的字符串。string
类型包含在 <string>
头文件中。之所以抛弃
char*
的字符串而选用C++
标准库中的string
类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,它集成的操作函数足以完成大多数情况下的需要。定义和初始化string对象
如何初始化类的对象是类本身决定的。一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量不同, 或者是初始值的类型不同。
类类型会调用类自己的构造函数进行初始化,一个类会定义多个构造函数来执行初始化。
以下是最基本的
string
的构造函数:直接初始化和拷贝初始化
使用等号
=
初始化一个变量,执行的是拷贝初始化(copy initialization),编译器把等号右侧的初始值拷贝到新创建的对象中去;不使用等号,执行的是直接初始化( direct initialization)当只有一个初始值时,使用直接初始化和拷贝初始化的效果是一样的。当有多个参数时,只能使用直接初始化,或者用
string s8 = string(10, 'c');
的形式先创建一个临时对象再执行拷贝初始化,这里同样是直接将临时对象替换过去的,因为临时对象在声明语句后消失,因而可以安全替换。string 可执行的操作
类除了定义了如何创建和初始化之外还定义了可以执行哪些操作。
C++
中的类既可以定义按名字调用的成员函数,也可以对操作符进行重载,事实上在 C++
中操作符是一种特殊的函数。以下是常用的几个 string
类方法:读写string对象
在执行读取操作时,
string
对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始读取,直到遇见下一处空白为止。当希望能在输出的字符串中保留输入的空白字符时,可以使用
getline
函数,getline
函数可以读取一整行字符。该函数只要遇到换行符就结束读取并返回结果(换行符也被读进来了),然后把所读内容存入到 string
对象中(不保存换行符)。如果输入的开始就是一个换行符,则得到空 string
。empty和size
empty
函数根据 string
对象是有为空返问一个对应的布尔值size
函数返回 string
对象的长度,返回的类型是 string::size_type
而不是 int
,此类型定义在 string
内部作为其补充类型,补充类型使得标准库在不同机器上可以进行不同的实现,从而满足可移植的目的。string::size_type
被定义为一种无符号类型并且足够长用以容纳任何字符串的长度。在C++
中应该尽可能使用此类型,为了避免繁杂的拼写,可以用auto
或decltype
关键字。注:不要将
string::size_type
与int
混用,因为负数会被转化为非常大的无符号值。比较string 对象
相等性运算符(
==
和!=
)分别检验两个string
对象相等或不相等,string
对象相等意味着它们的长度相同而且所包含的字符也全都相同。关系运算符<、<=、>、>=分别检验一个string
对象是否小于、小于等于、大于、大于等于另外一个string
对象。上述这些运算符都依照(大小写敏感的)字典顺序:- 如果两个
string
对象的长度不同,且短string
对象的每个字符都与长string
对象对应位置上的字符相同,就说短string
小于长string
(\0
小于任何字符)
- 如果两个
string
对象在某些对应的位置上不一致,则string
对象比较的结果其实是string
对象中第一对相异字符比较的结果
字面量与 string 字符串相加
注意在
+
操作符重载中,函数定义希望接收的参数是 string
类型,但是可以传递字符串字面量。当
C++
需要一种类型,而另外一种类型可以转换为此类型时,可以将那一种类型的值传入。string
类允许将字符字面量和字符串字面量转为string
对象。因而可以混用 string
和字面量于 +
操作符重载函数中。但是不能完全使用字面量,原因在于完全使用字面量将会调用字符数组的加法运算,而数组不支持此运算,将无法通过编译。string
类的这种转换事实上是由对应接收单个参数的构造函数定义的,C++
会隐式调用此构造函数来执行转换。由于
C++
必须兼容C
,字符串字面量并不是string
类型,而是以空字符 \0
结尾的字符数组。但进行混用时应当有所理解。处理 string 中的字符
cctype
头文件中定义与字符相关的函数:C++
除了使用其自己定义的标准库外,还会使用C
的标准库。C++
版本的C
标准库头文件名字被替换为c
开头,然后去掉.h
后缀,如:ctype.h
在 C++
中为 cctype
。这样做的好处在于新的头文件中所有函数都在std
名称空间中。为了处理
string
中的字符有三种方法:范围 for(range for)语句、迭代器以及下标运算符。范围 for(range for)语句
范围
for
语句是C++11
标准中引入的,形如:其中 declaration 跟普通的声明一样,可以使用auto或者decltype
如果希望改变 expression 所表示对象中值或者避免拷贝,将声明中的变量指定为引用。范围 for 会顺序遍历中的 expression 中的元素,并将值拷贝到控制变量中。
下标运算符
下标运算
[]
返回的是元素的引用,C++
中的所有下标都是从 0 开始。如果下标超出了范围得到的结果是未定义的,因而对空字符串进行下标操作是未定义的。这种数组越界的错误在 C++
中是不检查的,程序员必须自己保证下标不会越界。注意: string
的下标操作要求索引必须是 string::size_type
类型的,所以并不支持负数的索引,这与数组的索引允许负数是不一致的。string
的下标运算允许随机访问。C++
标准并不要求标准库检测下标是否合法。编程时可以把下标的类型定义为相应的 size_type
,这是一种无符号数,可以确保下标不会小于0,此时代码只需要保证下标小于 size
的值就可以了。