3.2 创建并初始化C++字符串

创建和初始化字符串对象是一件简单的事情并且相当灵活。在下面的Smallstring.cpp例子中,第1个string对象imBlank虽然被声明了,但并不包含初始值。C语言中的char型数组在初始化前都包含随机的无意义的位模式(bit pattern),而与此不同,imBlank确实包含了有意义的信息。这个string对象被初始化成包含“没有字符(no character)”,通过类的成员函数能够正确地报告其长度为零并且没有数据元素。

第2个串是heyMom,它被文字参数“Where are my socks?”初始化,这种形式的初始化使用一个引用字符数组(quoted character array)作为string构造函数的参数。相比之下,对象standardReply只使用一个赋值操作来完成初始化。这一组中的最后一个字符串是use ThisOneAgain,它的初始化采用的是一个现有的C++string对象来完成。换句话说,这个例子阐述了可以对新创建的string对象做以下几件事:

·创建空string对象,且并不立即用字符数据对其初始化。

·将一个文字的引用字符数组作为参数传递给构造函数,以此来对一个string对象进行初始化。

·用等号(=)来初始化一个string对象。

·用一个string对象初始化另一个string对象。

3.2 创建并初始化C++字符串 - 图1

这些都是string对象初始化最简单的形式,但若对此做少许改动,便可更灵活地进行初始化,并对其进行更好地控制。可以这样做:

·使用C语言的char型数组或C++string类两者任一个的一部分。

·用operator+来将不同的初始化数据源结合在一起。

·用string对象的成员函数substr()来创建一个子串。下面的程序解释了这些特征:

3.2 创建并初始化C++字符串 - 图2

3.2 创建并初始化C++字符串 - 图3

string类对象的成员函数substr()将开始位置作为其第1个参数,而将待选字符的个数作为其第2个参数。两个参数都有默认值。如果使用空的参数列表来调用substr(),那么将会构造出整个string对象的一个拷贝,所以这是复制string对象的一种简便方法。

下面是程序的输出:

3.2 创建并初始化C++字符串 - 图4

注意上例的最后一行。C++允许不同的string类对象初始化技术在单个语句中的混合使用,这是一种灵活方便的特征。还有,最后一个初始化操作从源string对象中复制的仅仅是一个字符。

另一个稍微精巧些的初始化方法利用了string类的迭代器string:begin()和string:end()。这种技术将string看做容器对象(迄今为止读者所见到的容器主要是vector—在第7章将会看到更多的容器),它用迭代器来指示字符序列的开始与结尾。借助这种方法,就可以给string类的构造函数传递两个迭代器,构造函数从一个迭代器开始直到另一个迭代器结束,将它们之间的数据拷贝到新的string对象中:

3.2 创建并初始化C++字符串 - 图5

迭代器并不局限于begin()和end();可以对一个对象使用的迭代器的运算包括增1、减1以及加上整数偏移量,这些运算允许程序员从源string对象中提取字符的子集。

不可以使用单个的字符、ASCII码或其他整数值来初始化C++字符串。但是,可用单个字符的多个拷贝来初始化字符串:

3.2 创建并初始化C++字符串 - 图6

第1个参数表示放入字符串中的第2个参数的拷贝的个数。第2个参数只能是单个字符的char型数据,而不能是char型数组。