看C++ primer 第四版(英文版)遇到了几个问题,请赐教!
问题1:用string,vector等包含的库是不是在iostream中有说明呢?在C++ primer的p132中提及When we compare library strings...这个意思不是要包含strings库吗?但是我在预编译加上#includeg++会报错(没有这个文件)?
问题2:在C++ primer的p86指出当一个string对象st1用另外一个string类对象str2赋值时所作的操作是:编译器需要delete和st1相关联的字符空间,并重新分配新的可供st2字符存放的空间,然后将st2对应的字符分配拷贝到st1中。
那么这里的st1所指的首地址是否改变呢?我一直以为是改变的,但是按照下面的程序看来是不变的,我想问一下这里到底做了什么呢?string类是不是可以动态分配同时可以自动回收空间,这和VLA是一个道理吗?
[code="c++"]
#include
int main(void)
{
std::string str1="str1\n";
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("str3\n");
str2=str3;
std::cout < <"address of str3 :" < <&str3 < <std::endl;
std::cout < <"address of str2 :" < <&str2 < <std::endl;
return 0;
}
[/code]
[quote]但是string不是内置类型,和int不同的啊,那本书p86说需要delete空间之后再重新分配的啊[/quote]
这一点非常正确,但是delete不是需要程序员手动进行的,是在超出其作用域的时候编译器会自动插于析构函数的执行。
简而言之,string类实例的复制,是“深复制”。
Re//问题1
iostream库是标准输入和输出库,它的基础是istream和ostream的类型,分别表示输入流和输出流。标准库定义了四个IO对象:cin,cout,cerr和clog。string,vector等包含的库没有在iostream中说明,如果#include #include 可以定义和使用string和vector类型。
Re//问题2
我在你的代码上做了些改动,可以看一下效果
#include
#include
#include
using namespace std;
int main()
{
string str1="str1\n";
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("str3\n");
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;
}
结果是:
str1
5
str1
address of str1 :0012FF64
address of str2 :0012FF54
address of str3 :0012FF44
address of str2 :0012FF54
str3 is :str3
str2 is :str3
str1 is :str1
从结果中可以看到str2的值改变了,而str2的地址并没有改变。
string str2(str1);
这只是用string的构造器的方式将str2初始化一个str1的值的副本。并没有对str1的地址或值产生影响。
str2=str3;
这只是把str3代表的字符串的值赋给str2,没有对str2的地址做什么,所以str2的地址没有变化。
所以一定要区分字符串字面值和字符串数据类型,string类不能自动回收空间。
[quote]所以一定要区分字符串字面值和字符串数据类型,string类不能自动回收空间。[/quote]
前半句说的非常好,后半句完全错误。
string str("abc");
str 在超出其作用域时,会被自动释放的,人家是有析构函数的!
[quote]引用的内容我省略了,一言难尽,总之他说的是使用C++风格的string类时需要strings库,对此我比较迷惑。[/quote]
还是这里说话比较安静。
看看这句话我明白了你的疑问了,我们看看原文:When we compare library strings...
这句话的意思翻译过来是说:当我们比较标准库字符串变量时...
并不是说存在一个库叫 strings ,这个单词就是“字符串”的复数而已,这就是读外文技术的弊病。