一、C++的参数化多态
面向对象的多态性可以分为重载多态、强制多态、包含多态和参数多态四类,重载多态和强制多态统称为专用多态,包含多态和参数多态统称为通用多态。代码重用是C++重要的特性之一,通用代码应不受数据类型的影响,并且可以自动适应数据类型的变化,此程序设计类型便是参数化程序设计[1]。
参数化多态性,即将程序所处理的对象的类型参数化,使得一段程序可以用于处理多种不同类型的对象。模板是C++支持参数化程序设计的工具,通过它可以实现参数化多态性。本文将基于参数化多态进行展开学习。
二、函数模板
函数模板只需要编写一次,然后基于调用函数时提供的参数类型,C++编译器将自动产生相应的函数来正确地处理该类型的数据。函数模板的定义方式如下:
template<模板参数表>
函数返回值类型 函数名(参数表) {函数体的定义}
模板参数表由用逗号分隔的模板参数构成,可以包括class(或typename)标识符指明的类型参数、“类型说明符”标识符指明的规定类型的常量参数以及template<参数表>class标识符指明的类模板名参数。
补充说明:
1. typename在C++中主要有两个作用,分别为在模板编程中声明一个依赖于模板参数的类型(当编译器无法确定某个标识符是类型还是变量时,使用typename明确告诉编译器这是一个类型)以及在模板编程中替代class声明模板参数(此处class与typename功能相同);
2. 类型说明符用来指定变量或函数的类型,而类型限定符(如const和volatile)用于修饰类型。类型说明符,指在声明变量、函数等用来指定类型的那些关键字和符号,如C++内置的基本数据类型(如int、double、char等)、用户自定义的类、结构体、枚举、类型别名(typedef或using定义的类型)以及类型推导说明符(auto和decltype);
3. 对模板参数表中可以包括“类型说明符”标识符指明的规定类型的常量参数进一步解释。模板是在编译时进行实例化的,编译器需要在编译阶段就知道模板参数的值,以便生成具体的代码。
注意事项:
1. 类型参数可以用来指定函数模板本身的形参类型、返回值类型,以及声明函数中的局部变量;
2. 虽然函数重载通常是对于不同的数据类型完成类似的操作,但是函数重载实现算法时,只是使用相同的函数名,函数体仍然要分别定义。函数模板则实现了一段通用代码适用于多种不同数据类型,极大地提高了代码的可重用性和软件的开发效率;
3. 被多个源文件引用的函数模板,应当连同函数体一同放在头文件中,而不能像普通函数那样只将声明放在头文件中;
4. 函数指针也只能指向模板的实例,而不能指向模板本身。
三、类模板
使用类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数、返回值或局部变量能取任意类型(包括系统预定义的和用户自定义的)。
类是对一组对象的公共性质的抽象,而类模板则是对不同类的公共性质的抽象。由于类模板需要一种或多种类型参数,所以类模板也常被称为参数化类[1]。类模板声明的语法形式为:
template<模板参数表>
class 类名{类成员声明};
注意事项:
1. 类成员声明的方法与普通类的定义几乎相同,只是在它的各个成员(数据成员和函数成员)中通常要用到模板的类型参数T。
四、代码实验
/*
* 模板函数的使用
*/#include <iostream>using namespace std;template<typename T>
void outputArray(const T* array, size_t count)
{for (size_t i = 0; i < count; i++)cout << array[i] << "";cout << endl;
}int main()
{const size_t A_COUNT = 8, B_COUNT = 8, C_COUNT = 20;int a[A_COUNT] = {1,2,3,4,5,6,7,8};double b[B_COUNT] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8};char c[C_COUNT] = "Welcome to see you!";cout << "a array contains:" << endl;outputArray(a,A_COUNT);cout << "b array contains:" << endl;outputArray(b, B_COUNT);cout << "c array contains:" << endl;outputArray(c, C_COUNT);return 0;
};
参考资料:
[1] C++语言程序设计 / 郑莉,董渊,何江舟编著.—4版.—北京:清华大学出版社,2010.7(清华大学计算机系列教材)
[2] C++ Primer中文版:第5版 /(美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)著;王刚,杨巨峰译. —北京:电子工业出版社,2013.9.