问题描述
看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类不能自动回收空间。