string类的两个问题

问题描述

看C++ primer 第四版(英文版)遇到了几个问题,请赐教!问题1:用string,vector等包含的库是不是在iostream中有说明呢?在C++ primer的p132中提及When we compare library strings...这个意思不是要包含strings库吗?但是我在预编译加上#include<strings>g++会报错(没有这个文件)?问题2:在C++ primer的p86指出当一个string对象st1用另外一个string类对象str2赋值时所作的操作是:编译器需要delete和st1相关联的字符空间,并重新分配新的可供st2字符存放的空间,然后将st2对应的字符分配拷贝到st1中。那么这里的st1所指的首地址是否改变呢?我一直以为是改变的,但是按照下面的程序看来是不变的,我想问一下这里到底做了什么呢?string类是不是可以动态分配同时可以自动回收空间,这和VLA是一个道理吗?#include <iostream> int main(void) { std::string str1="str1n"; std::cout < <str1; std::cout < <str1.size() < <std::endl; std::string str2(str1); std::cout < <str2 < <std::endl; std::cout < <"address of str1 :" < <&str1 < <std::endl; std::cout < <"address of str2 :" < <&str2 < <std::endl; std::string str3("str3n"); str2=str3; std::cout < <"address of str3 :" < <&str3 < <std::endl; std::cout < <"address of str2 :" < <&str2 < <std::endl; return 0; } 问题补充:牟盖东 写道

解决方案

引用但是string不是内置类型,和int不同的啊,那本书p86说需要delete空间之后再重新分配的啊这一点非常正确,但是delete不是需要程序员手动进行的,是在超出其作用域的时候编译器会自动插于析构函数的执行。简而言之,string类实例的复制,是“深复制”。
解决方案二:
引用引用的内容我省略了,一言难尽,总之他说的是使用C++风格的string类时需要strings库,对此我比较迷惑。还是这里说话比较安静。看看这句话我明白了你的疑问了,我们看看原文:When we compare library strings...这句话的意思翻译过来是说:当我们比较标准库字符串变量时...并不是说存在一个库叫 strings ,这个单词就是“字符串”的复数而已,这就是读外文技术的弊病。
解决方案三:
引用所以一定要区分字符串字面值和字符串数据类型,string类不能自动回收空间。前半句说的非常好,后半句完全错误。string str("abc");str 在超出其作用域时,会被自动释放的,人家是有析构函数的!
解决方案四:
Re//问题1iostream库是标准输入和输出库,它的基础是istream和ostream的类型,分别表示输入流和输出流。标准库定义了四个IO对象:cin,cout,cerr和clog。string,vector等包含的库没有在iostream中说明,如果#include<string> #include<vector> 可以定义和使用string和vector类型。Re//问题2我在你的代码上做了些改动,可以看一下效果#include <iostream>#include <string>#include <vector>using namespace std;int main(){ string str1="str1n"; cout<<str1; cout<<str1.size() <<std::endl; string str2(str1); cout<<str2 <<std::endl; cout<<"address of str1 :" <<&str1 <<endl; cout<<"address of str2 :" <<&str2 <<endl; string str3("str3n"); str2=str3; cout<<"address of str3 :" <<&str3 <<endl; cout<<"address of str2 :" <<&str2 <<endl; cout<<"str3 is :"<<str3; cout<<"str2 is :"<<str2; cout<<"str1 is :"<<str1; return 0;}结果是:str15str1address of str1 :0012FF64address of str2 :0012FF54address of str3 :0012FF44address of str2 :0012FF54str3 is :str3str2 is :str3str1 is :str1从结果中可以看到str2的值改变了,而str2的地址并没有改变。string str2(str1); 这只是用string的构造器的方式将str2初始化一个str1的值的副本。并没有对str1的地址或值产生影响。str2=str3;这只是把str3代表的字符串的值赋给str2,没有对str2的地址做什么,所以str2的地址没有变化。所以一定要区分字符串字面值和字符串数据类型,string类不能自动回收空间。

时间: 2024-11-06 07:27:13

string类的两个问题的相关文章

string-java中String类两种初始化的区别

问题描述 java中String类两种初始化的区别 解决方案 首先,你得理解下JAVA的存储区主要有三个:栈.堆.静态区.这三个的生命周期不一样,分配方式也不一样,存储内容也不一样 String a="aaa"这里的aaa存放就是在静态区,如果还有后头又定义一个string b="aaa",那么java里头会把它也指向a指向的地方.整个aaa会一直等到你程序退出了才释放空间 而String a1=new String("aaa").这里aaa是放

Java的string类常量池及不可变性

1.String常量池     当使用new String("hello")时,JVM会先使用常量池来管理"hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的对象被保存在堆内存中.即new String("hello")一共产生了两个字符串对象. [常量池constant pool]管理在编译时被确定并保存在已编译的.class文件中的一些数据,包括关于类.方法.接口中的常量,和字符串常量.  [字符串常量池

简介C++中的String类

C++中针对C语言中处理字符串的难题,在标准库中设计了string类,因此现在编程中涉及到字符串的处理,就可以直接使用string类了. 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要.我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?).我们尽可以把它看成是C++的基本数据类型. 首先,为了在我们的程序

Java编程那些事儿75——String类使用

9.5.3 String和StringBuffer String和StringBuffer类都是代表字符串,也就是任意多个字符组成的序列.程序需要存储的大量文字一般都使用字符串进行代表.在这两个类中,包含了大部分关于字符串操作的方法,在实际操作字符串时,可以首先查阅这两个类中的方法. String和StringBuffer虽然都代表字符串,但是由于两个类内部实现的区别,所以一般把String看成不可变字符串,而把StringBuffer看成可变字符串,对于String的每次改变(例如字符串连接等

图片-有关string类字符串拆分的问题

问题描述 有关string类字符串拆分的问题 这样的数据文件 我想用getline(file line);//按行提取文件,然后把每一行拆分成五部分分别用int a bcde保存 :例如第一行最后 a=0;b=640;c=75;d=75;e=75;应该怎样实现呢里面的string类可以转成int吗String类的拆分一般都有什么函数呢谢谢大家 解决方案 Java?用split函数 解决方案二: C++的话,自己实现一个类似的splithttp://www.cnblogs.com/zhiranok

C++string类常用函数

string类的构造函数:string(const char *s);   //用c字符串s初始化string(int n,char c);   //用n个字符c初始化此外,string类还支持默认构造函数和复制构造函数,如string s1:string s2="hello":都是正确的写法.当构造的string太长而无法表达时会抛出length_error异常 string类的字符操作:const char &operator[](int n)const;const cha

新手-关于c++ string类的基础问题,求解!

问题描述 关于c++ string类的基础问题,求解! string name; string dessert; 和const int artsize = 20; char name[artsize]; char dessert[artsize];是不是一样,区别在哪里? cin.getline(name,artsize); cout<<' '; cin.getline(dessert,artsize); 和getline(cin,name); cout<<' '; getline

Java基础之010-深入理解Java的String类

Java基础之010-深入理解Java的String类                                        老帅        1. 首先String不属于8种基本数据类型,String是一个类.  因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性.  2. new String()和new String("")都是申明一个新的空字符串,是空串不是null:  3. String对象实例化   

Java基础之009-浅尝Java的String类

Java基础之009-浅尝Java的String类                                        老帅 一.String类   1. 获取:        1.1 获取字符串中字符的个数(长度).                            int length();        1.2 根据位置获取字符.                            char charAt(int index);        1.3 根据字符获取在字符串中