首页 > 代码库 > string对象的几种构造方法
string对象的几种构造方法
在某种程度上,可以将string类型视为字符容器,支持很多容器操作。与vector相似,string的字符也是连续存储的,因此也有capacity和reserve操作。另外,也可用迭代器输出字符串,如下例:
string s("Hello world!");string :: iterator iter = s.begin();while(iter!=s.end()){ cout << *iter;}
在创建一个string对象并初始化时,有以下几种方法(ch1、ch2、ch3为定义的字符数组):
char *ch1 = "hello world!";char ch2[] = "goodbye";char ch3[] = {‘a‘,‘b‘,‘c‘};string s1; string s2(2,‘a‘);string s3(s2);string s4(s3.begin(),s3.end());string s5(ch1);string s6(ch2,7);string s7(ch2+4,2);string s8(ch3);string s9(ch3,2);string s10(s6,2);string s11(s6,0,4);string s12(s6,0,10);
上述代码中s1-s9的创建中,s8的创建string对象是错误的!!!!下面分析每个对象:
- s1:没有采用其它对象进行初始化,而是调用了默认构造函数,因此,s1为空字符对象,即s1="";
- s2:采用2个字符a初始化s2,因此s2="aa";
- s3:s3是s2的一个副本,因此s3="aa";
- s4:采用两个迭代器之间的元素进行初始化s4,s3.begin()存放s3的第一个元素,s3.end()指向s3最后一个元素的下一个,但初始化为左闭合,因此不包括s3.end(),因此。s4="aa";
- s5:使用只有一个指针参数的构造函数定义s5,该指针指向以空字符结束的数组ch1的第一个自读,这个数组的所有字符,但不包括null(C风格字符串是以null结尾的),都被复制到新创建的s5中,s5="hello world!";
- s6:s6的初始化是通过一个指针和一个计数器来实现的,从这个指针指向的字符开始,复制该指针后面连续计数器个数的字符到新创建的string对象中,s6="goo";
- s7:s7的初始化与s6类似,但传进的指针是ch2数组中指向b的指针,s7="by";
- s8:s8并不是采用C风格字符串,调用这种形式的初始化式,必须是以空字符结束的数组。将不包含null的数组传递给此构造函数,将导致编译器无法检测的严重错误,只有当遇到null时,s8的初始化才会停止;
- s9:然而,s9的初始化是正确的,初始化包含了一个计数器,指明了需要复制的元素的个数,该元素个数必须小于数组长度,无论数组是否以null结尾都没有什么关系。s9="ab";
- s10:将s10初始化为s6的一个子串,第二个参数指定了开始复制的位置,从制定位置复制到最后,因此s10="odbye";
- s11:s11与s10是同种初始化方式,其中,第二个参数制定了开始复制字符的位置,第三个参数制定了复制的长度,因此s11="good";
- s12:当复制的长度超过字符串的结尾时,标准库规定只能复制到与被复制string对象结尾处,s12="goodbye"。
string对象的几种构造方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。