C++之模板
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++之模板,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4024字,纯文字阅读大概需要6分钟。
内容图文
C++之模板
1 为什么使用模板
C++是一门强类型语言,所以无法做到像一些动态语言(如 python 、 javascript )那样:编写出一段通用的逻辑,然后把任意类型的变量传入进行处理。
不过,泛型编程弥补了C++的这个缺点,通过把通用逻辑设计为模板,摆脱了类型的限制,提供了继承机制以外的另一种抽象机 制,极大地提升了代码的可重用性。
2 什么是模板
模板是泛型编程的基础,泛型编程是一种代码编写方式,通过使用泛型编程,我们可以编写出独立于任何特定类型的代码。
模板是创建泛型函数或类的蓝图(公式)。C++的STL容器,及其迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 vector ,我们可以定义许多包含不同类型元素的 vector ,比如: vector <int> 或 vector <string>。
C++的模板包括函数模板和类模板。
3 函数模板
介绍
把处理不同类型的公共逻辑抽象成函数,就得到了函数模板。函数模板可以用来创建一个通用的函数,以支持多种不同类型的形参,避免重载函数的函数体重复设计。
函数模板的最大特点是把函数使用的数据类型作为参数。
格式
函数模板的格式:
template <typename type> ret-type func-name(parameter list)
{
// 函数的主体
}
说明:
- type 是函数所使用的数据类型的占位符名称,这个占位符名称可以在函数定义中使用;
- 关键字“typename”可替换为“class”,两者作用一样;
- ret-type 为函数的返回值;
在实际使用时,为了结构清晰,可将上述格式改为如下样式:
template <typename type>
ret-type func-name(parameter list)
{
? ?// 函数的主体
}
示例
函数模板的示例代码(template_fun.cpp)如下:
#include <iostream>
using namespace std;
template <typename T>
T Max(T a, T b)
{
? ? return (a > b ? a : b);
}
int main()
{
? ? int i = 1;
? ? int j = 2;
? ? cout << "Max(i, j) is: " << Max(i, j) << endl;
? ? cout << "Max<int>(i, j) is: " << Max<int>(i, j) << endl;
? ? float x = 1.1;
? ? float y = 2.2;
? ? cout << "Max(x, y) is: " << Max(x, y) << endl;
? ? return 0;
}
编译并运行上述代码,结果如下:
在上述结果能够看到,通过使用函数模板,我们可以使函数Max支持多种类型( int 和 float )的参数比较,实现了泛型编程的效果。
实参推断
在前面的函数模板的代码示例中,我们使用了两种方式为函数模板指定类型参数,如下:
cout << "Max(i, j) is: " << Max(i, j) << endl;
cout << "Max<int>(i, j) is: " << Max<int>(i, j) << endl;
正常情况下,我们使用“Max<int>(i, j)”这种形式为函数模板指定类型参数,可以理解为显式指定类型参数。而为了使用方便,除了显式为函数模板指定类型参数之外,我们还可以让编译器从传递给函数的实参推断出类型参数,这一功能被称为“模板实参推断”。如使用“Max(i, j)”形式时,编译器会根据 i 和 j 的实参值、推断出类型参数为 int ,其效果就相当于显式指定了 int 类型。
4 类模板
介绍
使用类模板可以使用户为类声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取值为任意类型。
注意:模板的声明或定义只能在全局、命名空间或类范围内进行,不能在局部范围、函数内进行,比如不能在main函数中声明或定义一个模板。
格式
template <typename type> class class-name {
// 类的主体
}
说明:
- type 是类所使用的数据类型的占位符名称,这个占位符名称可以在类的定义中使用;
- 关键字“typename”可替换为“class”,两者作用一样;
- 在实际使用时,为了结构清晰,可将上述格式改为如下样式:
template <typename type>
class class-name {
// 类的主体
}
示例
类模板的类声明代码(template_class.h)如下:
#ifndef __TEMPLATE_CLASS_H__
#define __TEMPLATE_CLASS_H__
template <typename T>
class CTmpl
{
public:
// 成员函数声明
T FunA(T a, T b);
CTmpl();
};
#endif
类模板的类实现代码(template_class.cpp)如下:
#include <iostream>
#include "template_class.h"
using namespace std;
template <typename T>
CTmpl<T>::CTmpl()
{
}
// 成员函数的具体实现
template <typename T>
T CTmpl<T>::FunA(T a, T b)
{
return (a + b);
}
int main()
{
CTmpl<int> tmpl_int;
cout << "tmpl_int.FunA(1, 2) is: " << tmpl_int.FunA(1, 2) << endl;
CTmpl<float> tmpl_float;
cout << "tmpl_float.FunA(1.1, 2.2) is: " << tmpl_float.FunA(1.1, 2.2) << endl;
return 0;
}
编译并运行上述代码,结果如下:
在这里需要注意在类模板外部定义成员函数的方法,如下:
template <typename T>
ret-type class-name<typename T>::fun-name(parameter list)
{
// 函数的主体
}
南方有乔木 发布了145 篇原创文章 · 获赞 81 · 访问量 13万+ 私信 关注
内容总结
以上是互联网集市为您收集整理的C++之模板全部内容,希望文章能够帮你解决C++之模板所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。