欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > C++多态性之参数化多态(三)—学习记录

C++多态性之参数化多态(三)—学习记录

2025/2/13 9:11:54 来源:https://blog.csdn.net/Jcb1906824038/article/details/145584969  浏览:    关键词:C++多态性之参数化多态(三)—学习记录

一、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.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com