西 安 邮 电 大 学
(计算机学院)
面向对象与 C++程序设计
课内实验报告
实验名称: 函数模板和类模板计
专业名称:
计算机科学与技术
班 级:
学生姓名:
学号(8 位):
指导教师:
实验时间:
一. 实验目的
练习 C++中函数模板、类模板的创建和使用方法。
(1) 理解模板的作用。
(2) 学习函数模板及其声明方法,掌握模板函数及其生成方法。
(3) 学习函数模板的两种不同的实例化方法。
(4) 学习类模板的声明与使用方法。
二. 实验内容
(1) 编写一个函数模板,实现两个变量交换。
(2) 编写一个函数模板 sort 实现选择法排序的功能,并在主函数 main( )中分别
实现
对 int 整型数组和 double 型数组的排序。
(3) 编译并运行下面的程序。尝试将其中显式实例化修改成隐式实例化后再进行
编
译,观察会出现什么现象?为什么会出现这种现象?
#include
using namespace std;
template T min(T a, T b)
{
return (a(i, cobj1 )<(cobj2, j )<编程实现一个栈类模板(包括其成员函数定义)。在应用程序中创建整数栈、字
符栈
和浮点数栈,并提供一些数据供进栈、出栈和显示操作。
三.方案设计(核心代码和流程设计)
Cpp1:
template T Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = temp;
}
Cpp2:
template
void Mysort(T *arr,int length)
{
int i,j,k;
T num;
for(i=0; i
class Stack
{
public:
Stack();
~Stack(){}
void push(T i);
T pop();
int tos;
T stack[SIZE];
private:
};
template
Stack ::Stack()
{
tos=-1;
}
template
void Stack::push(T i)
{
if(tos==SIZE)
{
cout<<"Stack is full"<
T Stack::pop()
{
if(tos<0)
{
}
else
{
}
}
}
else
{
}
}
cout<<"Stack underflow"<Cpp4:
请输入 10 个整形数据:
1 2 3 4 5 6 7 8 98 6
出栈数据:
6 98 8 7 6 5 4 3 2 1
请输入 10 个字符型数据:
q w e r t y u u i y
出栈数据:
y i u u y t r e w q
请输入 10 个浮点型数据:
1.1 1.2 1.3 4.4 5.5 6.6 7.7 8.8 9.9 0.0
出栈数据:
0 9.9 8.8 7.7 6.6 5.5 4.4 1.3 1.2 1.1
--------------------------------
Process exited after 54.17 seconds with return value 0
请按任意键继续. . .
2.非正常测试数据(2 组)及运行结果。
Cpp3:
//给出样例函数报错:
15 24 E:\c++\8th_3.cpp[Error] call of overloaded 'min(int&, char&)'
is
ambiguous
原因是 std 中已经有了一个名字叫 min 的函数(在 stl_algobase.h 文件的 148
行),导致名字冲突,
隐式实例化:
17 20 E:\c++\上机实验\8th_3.cpp
'min1(char&, int&)'
'min1(int&, char&)'
15 20 E:\c++\上机实验\8th_3.cpp
17 20 E:\c++\上机实验\8th_3.cpp
'min1(char&, int&)'
[Error] no matching function for call to
[Error] no matching function for call to
[Error] no matching function for call to
不能找到对应的模板函数!
五.总结
1. 实验过程中遇到的问题及解决办法。
遇到的主要问题主要是类模板,函数模板相对来说比较容易,主要是把握好
不同的实例函数主要特有的变量类型,对于公共变量的使用通常非模板函数是相
同的,实验过程中感觉难度相对来说较大是第四个,关于栈模板的书写,花费时
间较多。
2. 对设计及调试过程的心得体会。
在学习随着课程学习的深入,我感觉到了利用类和对象、继承、封装等
一系列知识可以把我们程序中很多繁杂、重复的部分省略掉,还可以解决一
些利用面向过程的设计思想无法解决的问题,这次实验练习了函数模板,进
一步给我们的变成提供了一个有效途径,提高的代码的利用率,降低复用性,
大大提高的程序员的编程速度。
模板本身不是可编译的代码,而是用来知道编译器生成可执行代码的文
本,函数模板实际上是提取一系列具有形同或者是近似操作流程的函数中的
共性给予规范描述,从而使得编译器可以在需要的时候,根据描述自动生成
可编译代码并编译,有了函数模板,程序员的工作从体力劳动向脑力劳动又
向前迈出了一小步!
六.附录:源代码(请把源代码按照实验内容附到其后)
Cpp1:
template
T Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = temp;
}
Cpp2:
#include
using namespace std;
template
void Mysort(T *arr,int length)
{
int i,j,k;
T num;
for(i=0; icin>>m;
for(i=0;i>a[i];
cin>>n;
for(j=0;j>b[j];
Mysort(a,m);
Mysort(b,n);
for(i=0;i
using namespace std;
template T min1(T a,T b)
{
return (a
using namespace std;
const int SIZE = 10;
// 为方便测试程序,故将 SIZE 值设定为 10
template
class Stack
{
public:
Stack();
~Stack(){}
void push(T i);
T pop();
private:
int tos;
T stack[SIZE];
};
template
Stack ::Stack()
{
tos=-1;
}
template
void Stack::push(T i)
{
if(tos==SIZE)
{
cout<<"Stack is full"<
T Stack::pop()
{
if(tos<0)
{
cout<<"Stack underflow"<