当前位置:文档之家› C++ string类专题(修订版)

C++ string类专题(修订版)

本文作者:黄邦勇帅(编著)(原名:黄勇)本文是学习C++的附加内容,主要介绍了C++中的string类的各种成员函数,及成员函数的功能与作用,是作为学习C++的参考使用的。

本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正本文使用的是x86机器(主流计算机都是x86机器),windows xp操作系统,VC++2010编译器进行讲解的。

本文内容完全属于个人见解与参考文现的作者无关,限于水平有限,其中难免有误解之处,望指出更正。

声明:禁止抄袭,复印,转载本文,本文作者拥有完全版权。

主要参考文献:1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社 2005年5月2、C++.Primer第四版.中文版 Stanley B.Lippman、Barbara E.Moo、Josee Lajoie著李师贤、蒋爱军等译人民邮电出版社 2006年3月3、C++.Primer第三版.中文版 Stanley B.Lippman、Josee Lajoie著潘爱民、张丽等译中国电力版社 2002年5月第19部分 string类专题(共9页)(2016-7-15 修订版)1、string类用于处理字符串,用于代替使用不方便的C风格字符串,使用string类表示的字符串我们可以像处理普通变量那样处理字符串,因此可以对string类表示的字符串进行直接的相加,比较,赋值等操作,比如string s1=”abc”,s2=”def”;则s1=s1+s2;结果s1=”abcdef”;s1=s2;则结果s1=”def” 等,C风格字符串只能使用内置的库函数进行这些操作,使用很不方便,比如char c1[]=”abc”; char c2[]=”def”;则c1=c2;错误,不能改变数组的地址,c1>c2比较的是两个指针的地址而不是字符的大小;c1+c2;错误,这是把两个指针的地址相加而不是把两个字符数组相加。

2、string对象创建的字符串的最大特点是:可以自动调整对象大小以适应所需的字符串,string对象能存储的最大字符数由string类的静态常量string::npos设定,通常是最大的unsigned int值。

一、string类的原型1、要使用string类需要包含string头文件。

2、string是一个模板类,因此它具有类和模板的特性,也就是说string类有构造函数、重载的操作符、成员函数等,因为string是模板类,因此应建一个模板类具体实例化版本的对象才能使用,然后通过对象调用成员函数使用类。

3、记住string s;创建的s是一个类的对象,而不是字符串字面值,他们是两种不同的类型。

4、string类是模板类basic_string类的char特化体版本使用typedef命名后的别名,wstring类是模板类basic_string的wchar特体化版本使用typedef命名后的别名。

5、basic_string类的原型为(重点):template<class charT, class traits=char_traits<charT>, class Allocator=allocator<charT> > class basic_string;1)、charT是个类型模板形参,若实例化时传递char类型,则charT=char,传递wchar则charT=wchar2)、traits是类型模板形参,描述了字符串的特征,比如字符串是否以’\0’作为结束尾等。

traits要求传递一个char_traits<T>的模板类型作为实参。

3)、Allocator也是个类模板形参,他的主要作用是用于处理字符串的内存分配问题,默认使用new和delete分配内存。

Allocator要求传递一个allocator<T>类型的模板类型作为实参。

4)、basic_string有两个特化体版本(重点),如下所示,当然我们也可以实例化其他类型版本的base_string类模板,①、typedef base_string<char> string; //即string类是使用typedef重命名后的basic_string类模板的char特化体版本。

②、typedef base_string<wchar_t> wstring; //主要用于处理宽字符串。

6、size_type类型(重要):size_type是basic_string类中定义的类型,一般被定义为unsigned类型。

需要使用限定名的方法来使用size_type类型,比如string::size_type a;或basic_string<char>::size_type a;7、npos静态常量(重要):表示string对象能够存储的最大字符数,其形式为:static const size_type npos=-1; 可见npos是basic_string类中定义的静态常量,其类型为size_type其值为-1,对于无符号的size_type变量,赋值为-1,相当于是把最大的无符号数赋值给了他。

二、string类的构造函数1、basic_string的构造函数与char特化版本的string构造函数的差别,只在于basic_string构造函数多了一个用于分配内存的默认形参const Allocator& a=Allocator(); 比如string类的构造函数string(const char *s);其对应的basic_string 构造函数形式为basic_string(const charT* s, const Allocator& a=Allocator());2、string类有6种形式的构造函数,本文使用basic_string类模板简化后的string构造函数版本。

1)、原型1:string();意义:创建一个默认的string对象,长度为0。

示例:string s; 表示创建一个长度为0的字符串对象s。

2)、原型2:string(const char *s);意义:将string对象初始化为s指向的传统C风格字符串(即以空字符结束的字符串)。

示例:string s(“hyong”);则结果为s=”hyong”。

3)、原型3:string(size_type n,char c);意义:创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c。

示例:string s(4, ‘c’);则结果为s=”aaaa”。

4)、原型4:string(const string &str, size_type pos=0, size_type n=npos); //这是复制构造函数。

意义1:将string对象初始化为str中从pos开始的n个字符,或从pos开始到结尾的字符,其中npos表示string对象的最大长度。

示例1:string s=”ABCDEFG”; string s1(s,2,4);则结果s1=”CDEF”; 再如string s2(s,2);结果为s2=”CDEFG”;意义2:该构造函数的默认值形式为复制构造函数,经常被用于创建一个已存在的string对象的副本,示例2:string s=”CDEF”; string s1(s); 则s1=s=”CDEF”意义3:若指定的字符个数大于源字符串的长度,则使用源字符串到末尾的字符初始化目标string对象,示例3:string s(“ABDE”); string s1(s,0,22);则s1=”ABDE”;意义4:pos的值不能大于源字符串的长度,否则抛出out_of_range异常。

示例4:string s(“ABCD”); string s1(s,22);错误5)、原型5:string(const char *s, size_type n);意义:将string对象初始化为s指向的传统C字符串中的前n个字符,即使超出了字符串的范围,操作仍会进行。

示例:char c[]=”hyong”; string s(c, 5);结果为s=”hyong”。

注意即使复制的长度超出了数组的长度,操作仍将进行,也就是说如果把5改为10的话,将导致5个无用的字符被复制到对象中。

6)、原型6:tempalte<class Iter>string(Iter begin, Iter end);意义:将string对象初始化为[begin, end)间的字符,其中begin和end类似于指针用于指定位置,范围包括begin在内,但不包括end,注意不包括end。

还要注意begin和end被看着指针,该方法可用于数组、字符串和STL容器。

示例1:char c[ ]=”hyongilfmm”; string s(c+2, c+4); 结果s=”on”表示使用从指针c指向的字符串”hyongilfmmm”,位于区间[2,4)的字符”on”初始化s,注意第4个字符不包括在内。

注意,字符串从0开始计数。

示例2:string a=”hyong”;string b(a+3, a+5);是错误的,因为begin和end被看着指针指向的某一位置,而a 是string类对象,而不是指针,所以a+3没有意义,所以这里应这样string b(&a[3], &a[5])表示的是指针所指区间[&a[3], &a[5])之内的字符,相当于是从&a[3]开始的&a[5]-&a[3]个字符。

注意&a+3与&a[3]表示的是不同的意义,&a;表示string对象的地址,&a[3]表示string对象”hyong”中第3个字符所在位置的地址。

三、string类对象的特点1、不能用单个字符来初始化string对象,比如string a=’d’;将是错误的,但是string a(1,’d’)是正确的,这里将把’d’初始化为”d”。

2、string对象只能接收以空字符结尾的字符串,比如语句char b[ ]={‘a’, ‘b’, ‘c’}; string a=b;将是错误的。

3、不能将string对象的字符串赋值给char类型的数组或指针,因为他们是两个不同的类型。

四、string对象的输出输出1、 string对象的输入:可以使用cin和getline函数对string对象进行输入,注意:此处的geline函数不是istream流的成员函数。

相关主题