第十六章
1.考虑下面的类声明,若将它转换为使用string对象的声明,哪些方法不再需要显示定义?
class RQ1
{
private:
char* st;
public:
RQ1() { st = new char[1]; strcpy(st, ""); }
RQ1(const char* s)
{
st = new char[strlen(s) + 1];
strcpy(st, s);
}
RQ1(const RQ1& rq)
{
st = new char[strlen(rq.st) + 1];
strcpy(st, rq.st);
}
~RQ1() { delete[] st; }
RQ1& operator=(const RQ1& rq);
};
class RQ1
{
private:
string st;
public:
RQ1() { st = "";}
RQ1(string s) : st(s) {};
~RQ1() { }
};
由于string类已经定义了相关构造函数,实现了动态的存储管理,重载了复制运算符,完成了析构函数的存储空间回收,因此修改为string类型之后,类RQ1不需要用户自定义复制构造函数,析构程序和赋值运算符
2.在易于使用方面,指出string对象至少两个优于C风格字符串的地方
string类是C++语言中定义的字符串类,相比于C风格字符串,string类对象通过类内的构造函数,析构函数,赋值运算符以及相关的大量公有接口,能够让用户更简单的使用字符串,而不用考虑动态存储管理,类内部的深拷贝等问题。例如,可以将一个string对象通过赋值运算符 "="直接赋给另一个string对象;string对象提供了自己的内存管理功能,所以一般不需要担心字符串超出存储容量
3.编写一个函数,用string对象作为参数,将string对象转换为全部大写
4. 从概念上或语法上说,下面哪个不是正确使用auto_ptr的方法(假设已经包含了所需的头文件)?
auto_ptr<int> pia(new int [20]);
auto_ptr<string> (new string);
int rigue = 7;
auto_ptr<int>pr (&rigue);
auto_ptr dbl (new double);
1.auto_ptr<int> pia(new int(20));
2.auto_ptr<string> ps(new string);
3.int rigue = 7;
auto_ptr<int>pr (&rigue);
智能指针auto_ptr必须指向new生成的新的内存区域,不能使用已有变量的存储地址。
4.auto_ptr double(new double);
5.如果可以生成一个存储高尔夫球棍(而不是数字)的栈,为何它(从概念上说)是一个坏的高尔夫袋子?
6.若逐洞记录高尔夫成绩,为什么说set容器是糟糕的选择?
7.既然指针是一个迭代器,为什么STL设计人员没有简单的使用指针来代替迭代器呢?
C++语言的STL中,指针可以作为一个迭代器进行运算。也可以认为迭代器是一种广义上的指针,但是并不能简单认为可以用指针代替迭代器来设计STL。因为STL中容易类和迭代器的主要目的是实现一种泛型编程,指针无法适应多种容器类内部的多种复杂数据类型和数据的组织形式,并且特定类型的指针和泛型编程的目标相违背
8.为什么STL设计人员仅定义了迭代器基类,而使用继承来派生其他迭代器类型的类,并根据这些迭代器来表示算法?
C++语言的继承功能和RTTI技术使得迭代器基类与其他派生类的迭代器在通用算法中能够实现完整的功能,因此可以将STL函数用于指向常规数组的常规指针以及指向STL容器类的迭代器,进行统一处理,提高整个STL模板的通用性
9.给出vector对象比常规数组方便的3个例子
- 可动态调整大小
- 支持多种操作和灵活的访问方式
- 自动内存管理
10.如果程序16.9是使用list(而不是vector)实现的,则该程序的哪些部分将是非法的?非法部分能够轻松修复吗?如果可以如何修复?
random_shuffle()函数要求使用随机访问迭代器,而list对象只有双向迭代器,因此无法实现这种乱序访问
11.假设16.15所示的函数符TooBig,下面的代码有何功能?赋给bo的是什么值?
bool bo = TooBig<int> (10) (15);