C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计
“ 目录 C++语言程序设计 基本知识 编程技能 刨根问底 多态的概念 运行时多态 模板 重载与静态联编 覆盖与静态联编 虚函数与动态联编 函数模板 运行时多态 C++语言程序设计
基本知识 a C++语言程序设计
10.3 模 板 模板是C++ 中的通用程序模块。 C++ 中的模板: 在这些程序模块中,有一些数据类型是不具体的,或者说是抽象的。 10.3 模 板 模板是C++ 中的通用程序模块。 在这些程序模块中,有一些数据类型是不具体的,或者说是抽象的。 当这些抽象的数据类型更换为不同的具体数据类型以后,就会产生一系列具体的程序模块。 这些抽象的数据类型称为“参数化类型”(Parameterized Types)。 C++ 中的模板: 函数模板:会产生一系列参数类型不同的函数,实例化后产生的函数,称为模板函数 类模板:会产生一系列不同参数的类,实例化后产生的类,称为模板类。 C++语言程序设计
关键字“typename”可以用“class”取代 10.3 模 板 函数模版 函数模板是函数重载概念的发展和延伸 函数模板像是一个函数发生器,使用具体的数据类型取代模板中的参数化类型,即可得到一个个具体的函数。 这种通过类型取代获得的多态,属于参数多态。 template<typename T> T max_value(T x, T y, T z) { T temp = x>y?x:y; return temp>z?temp:z; } template <typename 参数化类型名> 函数返回类型 函数名(形式参数列表) { 函数体 } 关键字“typename”可以用“class”取代 C++语言程序设计
10.3 模 板 //Main10.cpp #include<iostream> using namespace std; 10.3 模 板 //Main10.cpp #include<iostream> using namespace std; template<typename T> T max_value(T x,T y,T z){ T temp = x>y?x:y; return temp>z?temp:z; } int main() { cout<<max_value(12,32,21)<<endl; //用整数作实参调用函数模板 cout<<max_value('a','A','9')<<endl; //用字符作实参调用函数模板 return 0; C++语言程序设计
10.3 模 板 函数模版,参数化类型名可以不止一个 程序运行结果是: 34500 -31036 C++语言程序设计 10.3 模 板 函数模版,参数化类型名可以不止一个 #include<iostream> using namespace std; template<typename P1,typename P2> P1 cal(P1 x, P2 y) { //函数模板有两个参数化类型名:P1和P2 return (x * static_cast<P1>(y)); //按x的数据类型执行乘法运算 } int main() { unsigned short w=230; short z=150; cout<<cal(w,z)<<endl; //按无符号数相乘 cout<<cal(z,w)<<endl; //按有符号数相乘 程序运行结果是: 34500 -31036 C++语言程序设计
10.3 模 板 带有确定类型参数的函数模板 函数模板的参数表中,一定要包含参数化类型名,但不一定只使用参数化类型名,还可以根据需要,使用确定类型的参数。 template <class Q1> void ArrayInput(Q1 array , int num) { cout<<"输入"<<num<<"个"<<typeid(Q1).name()<<'\b'<<"型数据"<<endl; for (int j= 0; j < num; j++) cin >> array[j]; //输入数组元素 } C++语言程序设计
typeid(表达式).name() 或 typeid(类型标识符).name() 10.3 模 板 typeid运算符 在程序运行时,显示指定的数据的类型。 typeid(表达式).name() 或 typeid(类型标识符).name() 执行的结果是返回“表达式”或者“类型标识符”的类型名。 int number; float floatArray[4]; int intArray[3]; number=sizeof(floatArray)/sizeof(float); ArrayInput(floatArray, number); number=sizeof(intArray)/sizeof(int); ArrayInput(intArray, number ); 输入4个float 型数据 1.1 2.2 3.3 4.4 输入3个int 型数据 5 6 7 typeid(floatArray).name() 返回的是float * typeid(intArray).name() 返回的是int * C++语言程序设计
10.3 模 板 类模板 template <class 参数化类型名1,…, class 参数化类型名n> 10.3 模 板 类模板 template <class 参数化类型名1,…, class 参数化类型名n> class 类名 { 数据成员定义; 成员函数原型; }; template <class T1, class T2> class MyClass { private: T1 x; T2 y; public: MyClass( T1 a, T2 b ); void display( ); }; C++语言程序设计
10.3 模 板 template < class T1, class T2> 10.3 模 板 template < class T1, class T2> MyClass< T1,T2 >::MyClass( T1 a, T2 b ) { x = a; y = b; } template <class T1, class T2> void MyClass< T1, T2 >::display( ) { cout<<x<<endl; cout<<y<<endl; } int main() { MyClass<int,float> Obj1(6,6.6); Obj1.display(); MyClass<char,char *> Obj2('x',"A string"); Obj2.display(); } C++语言程序设计
在类模板实例化和声明对象时,参数i用具体的整型值来代替 10.3 模 板 带有确定类型参数的类模板 template <class T, int i> class MyStack MyStack<int,5> Obj1; 在类模板实例化和声明对象时,参数i用具体的整型值来代替 C++语言程序设计