12.13 自助练习题
12.3 根据图 5.15 的排序程序编写函数摸板 bubbleSort。编写一个驱动程序,输入、排序和输出int数组与float数组。
12.4 重载图 12.2 的函数模板 printArray,使其取另外两个整数参数 int lowSubscript 和 int highSubscript。调用这个函数只打印数组中的指定部分。验证lowSubscript和highSubscript。如果其中一个值超界或 highSubscript 小于等于 lowSubscript,则重载的printArray函数返回0,否则printArray返回打印的元素个数。然后修改main,对数组a、b、c使用两个版本的printArray。一定要测试两个版本的printArray的各种可能情况。
12.5 用非模板版本重载图12.2的函数模板prinlArray,使其以整齐的表格式分栏格式打印字符串数组。
12.6 编写判定函数isEqualTo的简单函数模扳,用相等运算符比较其两个参数,如果相等则返回1,如果不相等则返回0。使用这个函数模扳,使得程序中对各种内部类型调用isEqualTo。现在编写程序的另一种形式,对用户自定义类的类型调用isEqualTo,但不重载相等运算符。运行这个程序时会发生什么情况?重载相等运算符(用运算符函数
operator==),运行这个程序时会发生什么情况?
12.7 用无类型参数numberOfElements和类型参数elementType生成第8章开发的Array类模板。这个模板按编译时指定个数的指定元素类型实例化Array对象。
12.8 编写一个使用类模板Array的程序,模板可以实例化任何元素类型的Array对象。用float元素的Array(class Array<float>)重定义模板。驱动程序演示通过模板实例化int类型的Array,并使用class Array<float>中提供的定义实例化float类型的Array。
12.9 试区分模板函数与函数模板。
12.10 类模板与模板类哪个像是能够绘制形状的模扳?为什么?
12.11 函数模板与重载有什么关系?
12.12 为什么选择函数模板而不选择宏?
12.13 使用函数模板与类模板可能造成哪些性能问题?
12.14 编译器通过匹配过程确定函数调用时调用哪个模板函数。什么情况下进行匹配会造成编译错误?
12.15 为什么类模板也称为参数化类型?
12.16 解释C++程序中使用下列语句的原因。
Array<Employee>workerList(100);
12.17 分析练习12.16的答案,解释C++程序中使用下列语句的原因。
Array<Employee>workerList;
12.18 解释C++程序中使用下列语句的原因。
template< class T > Array< T >::Array( int s )
12.19 为什么数组、堆栈之类的容器类模板通常用无类型参数?
12.20 说明如何提供特定类型的类重定义该类型的类模板。
12.21 说明类模板与继承的关系。
12.22 假设类模板的首部如下:
template<class T1>class C1
说明类模板首部中用下列友元声明时的友元关系。以f开头的标识符是函数,以C开头的标识符是类,以T开头的标识符是任何类型(即内部类型或类类型)。
a)friend void f1();
b)friend void f2(C1< T1 > &);
c)friend void C2::f4();
d)friend void C3<T1>::f5(C1<T1>&);
e)friend class C5;
f)friend class C6<T1>;
12.23 假设类模板Employee有static数据成员count。假设从类模板实例化三个模板类。那么有多少个static数据成员?各有什么限制(如果有)?