目录
面向对象的再理解
面向过程写法
面向对象写法
泛型机制
函数模板
类模板
类模板的定义
类模板的使用
有关类模板的小结:
const机制
面向对象方法将数据和对数据的基本操作处理函数都封装在一个类中,分别成为一个类的属性和成员函数。
整个类相当于定义了一个新的数据类型,然后根据具体问题建立该类的对象(即变量),通过对象调用合适的函数来解决实际问题。
实例
将1-20之间的奇数存入内存,之后在这组数中查找用户输入的任意一个整数并报告查找结果。
void setValue(int b[], int n);
void find(int b[], int n, int x);//查找xint main()
{ int data[10], a;setValue(data, 10);cout<<"a="; cin>>a;find(data,10,a);return 0;
}
void setValue(int b[], int n)
{ for (int i=0; i
class arr
{ private:int *a;int maxSize, count;public:arr(int size);void append(int x);void find(int x);~arr(){delete []a;}; };
arr::arr(int size)
{a = new int[size];maxSize = size;count = 0;
}void arr::append(int x)
{if (count==maxSize) return;a[count] = x;count++;
}
void arr::find(int x)
{ int i;for (i=0; i>a;obj.find(a);return 0;
}
因此在数据类型上使用泛型机制: 函数模板、类模板
函数模板定义
以max函数为例
template
T max(T x, T y) { if (x>y) return x; else return y;}
解释:上述代码在定义max函数对应的类模板时,数据类型标明的是T,此处的T未明确指出对应的类型,是因为所写模板可以适用于多种数据类型,当在其他位置调用此函数时,标明变量所对应的数据类型,系统会自动将数据类型传递到该函数,替换T,构成一个明确的函数。
函数模板的使用
int main
{ count<
上述函数中,第一个3,5对应的是int类型,第二个'a','h'对应的是字符串类型,此处系统会根据所给数据根据模板函数自动产生函数定义。
template
class arr
{ private:elemType *a;int maxSize, count;public:arr(int size);//参数前加const,保护参数在函数执行中不得修改void append(const elemType &x);//参数表后加const,保护调用函数的对象的值不得修改void find(const elemType &x)const;~arr(){delete []a;};
};template
//类模板中成员函数自动为函数模板
arr::arr(int size)
{a = new elemType[size];maxSize = size;count = 0;
}template
void arr::append(const elemType &x)
{if (count==maxSize) return;a[count] = x;count++;
}
template
void arr::find(const elemType &x) const
{int i;for (i=0; i
int main()
{ arr obj1(10); //使得类模板实例化为一个模板类const arr obj2(20);int a;const int b=100;for (int i=0; i<10; i++) obj1.append(2*i+1);cout<<"a="; cin>>a;cout<<"In obj1: "; obj1.find(a);cout<<"In obj1: "; obj1.find(b);cout<<"In obj2: "; obj2.find(a);return 0;
}
1、定义类时,要“加帽子”、“加胡须”。里面就可以使用一种泛化类型。
2、对类中每个成员函数实现时,也要戴帽子。里面使用泛化类型。
3、对于类模板,我们在使用时,写的外部函数,一定要注意泛化类型的实例化,比如上述main函数中的arr