1、考虑下面的 类声明
class RQ1
{
private:char * st;
public:RQ1(){st = new char [1]; strcpy(st,"");}RQ1(const RQ1 & rq){st = new char [strlen(rq.st)+1]; strcpy(st,rq.st);}~RQ1(){delete [] st};RQ & OPERATOR = (cosnt RQ &rq);
};
将它转换为使用string对象的声明。那些方法不再需要显示定义?
答:
#include <string>
using namespace std;
class RQ1
{
private:string st;
public:RQ1() :st(""){}RQ1 (const char * s): st(s){}~RQ1() {};
};
不再需要显式复制构造函数、析构程序和赋值运算符,因为string对象提供了自己的内存管理功能。
2、在易于使用方面,指出string对象至少两个优于C-风格字符串的地方。
答:可以将一个string对象赋给另一个。string对象提供了自己的内存管理功能,所以一般不需要担心字符串超出存储容量。
3、编写一个函数,用string对象作为参数,将string对象转换为全部大写。
答:
#include <string>
#include <cctype>
using namespace std;
void ToUpper(string & str)
{
for (int i = 0; i < str.size(); i++)str[i] = toupper(str[i]);
}
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 db1 (new double);
答:
auto_ptr<int> pia= new int [20];// wrong,use with new,not new []
auto_ptr<string>(new string); // wrong,no name for pointer
int rigue = 7;
auto_ptr<int> (&rigue);// wrong,memory not allocated by new
auto _ptr dbl (new double);// wrong,omits <double>
5、如果可以生成一个存储高尔夫球棍(而不是数字)的栈,为何它(从概念上说)是一个坏的高尔夫袋子?
答:栈的LIFO特征意味着可能必须在到达所需要的球棍(club之前删除很多球棍。
6、为什么说对于逐洞记录高尔夫成绩来说,set容器是糟糕的选择?
答:集合将只存储每个值的一个铂贝,因此,5个5分将被存储为1个5分。
7、既然指针是一个迭代器,为什么STL设计人员为没有简单的使用指针来代替迭代器呢?
答:使用迭代器使得能够使用接口类似于指针的对象遍历不以数组方式组织的数据,如双向链表中的数据。
8、为什么STL设计人员仅定义了迭代器基类,而使用继承来派生其他迭代器类型的类,并根据这些迭代器类来表示算法?
答:STL 方法使得可以将STL 函数用于指向常规数组的常规指针以及指向STL容器类的迭代器,因此提高了通用性。
9、给出vector对象比常规数组方便的3个例子。
答:可以将一个vector对象赋给另一个。vector管理自己的内存,
因此可以将元素插入到矢量中,并让它自动调整长度。使用at()方法,可以自动检查边界。
10、如果程序清单时使用list而不是vector实现的 ,则该程序的哪些部分是非法的?非法部分能够轻松修复吗?如果可以,如何修复呢?
答:这两个vector函数和random_shuffle()函数要求随机访问迭代器,而list对象只有双向迭代器。可以使用 list模板类的sort( )成员函数(参见附录G),而不是通用函数来排序,但没有与random_shuffe()等效的成员函数。然而,可以将链表复制到矢量中,然后打乱矢量,并将结果重新复制到链表中。
11、如果程序清单所示的函数符TooBig,下面的代码有何功能?赋给bo的是什么值?
bool bo = TooBig<int>(10)(15);
答:
- 使用
10
作为参数实例化Comparator<int>
类型的对象。 - 使用
15
调用该对象的operator()
,并返回结果(false
,因为10
不大于15
)。 - 将返回的结果(
false
)赋值给bool
类型的变量bo
。
所以,赋给 bo
的值是 false
。