这是一个关于 C++ 模板的简短教程。
读者:对C++有一点了解的人
免责声明:尽管这是我写的一篇文章,但我已经使用了来自各个网站的信息作为参考。所以我不能声称它完全是我自己的文章。另外,请原谅我犯的任何错误。
那我们开始吧。
您对函数进行了多少次编码,并考虑过它是否适用于不同的数据类型。或者您编写一个类并希望为各种数据类型实现相同的类。
一个非常简单的例子是添加函数。
[AppleScript] 纯文本查看 复制代码 int add(int a,int b)
{
return(a+b);
}
如果我们可以使用相同的函数来添加整数、长整数和浮点值,那不是很好吗?这就是模板发挥作用的地方。
模板:
基本上,模板使您的函数或类更加抽象,以便您可以为不同的数据类型实现单个类//函数。
我们现在可以将我们的模板分类为函数模板和类模板。
我们将首先处理函数模板。
函数模板
函数模板允许函数处理不同的数据类型。这可以使用模板参数来实现。模板参数是一种特殊的参数,可用于将类型作为参数传递:就像常规函数参数可用于将值传递给函数一样,模板参数也允许将类型传递给函数。这些函数模板可以像使用任何其他常规类型一样使用这些参数。
其语法是:
[AppleScript] 纯文本查看 复制代码 template <class identifier> function_declaration;
template <typename identifier> function_declaration;
要使用特定数据类型调用函数,我们使用:
[AppleScript] 纯文本查看 复制代码 function_name <datatype> (arguments);
我们将看一个例子来了解更多。
[AppleScript] 纯文本查看 复制代码 template <class T>
T add (T a, T b) {
return (a+b);
}
上面,我们已经创建了一个带有模板参数 T 的模板函数。现在,这个参数 T 代表一个尚未定义的类型。我们稍后可以将此参数定义为我们喜欢的数据类型。
这是 main() 部分中的函数调用:
[AppleScript] 纯文本查看 复制代码 int x=2,y=3;
float a=10.3,b=6.2;
int integerSum = add <int> (x,y);
float realSum = add <float> (a,b);
cout<<"Integer Sum = "<<integerSum;
cout<<"nFloat Sum = "<<realSum;
输出将是
[AppleScript] 纯文本查看 复制代码 Integer Sum = 5
我们现在可以分析我们是如何做到的。在主体中,我们首先声明我们的变量,x 和 y 是整数,a,b 是浮点数。
接下来,有一个整数变量 integerSum,它接受 add() 函数的结果。看看我们如何告诉函数我们正在使用整数。我们将参数的数据类型作为 <data type> 放在函数名和参数之间。所以,现在编译器知道我们正在向函数发送整数值。所以它在将两个数字相加后返回一个整数。浮点值也是如此。
此外,没有必要定义元素的数据类型。编译器会自动检查类型。因此,您可以将函数调用减少为:
[mw_shl_code=applescript,true]int a=2,b=3,sum=0;
sum=add(a,b);
cout<<sum;
Float Sum = 16.5[/mw_shl_code]
如果我们想发送两种不同的类型怎么办。然后,稍微更改声明以接受两种不同的类型。那是:
[AppleScript] 纯文本查看 复制代码 template <class T,class U>
和主体:
[mw_shl_code=applescript,true]float a=2.35,result;
int b=5;
result=add(a,b); ////If you want, you can use result=add <float,int>(a,b);
T add (T a, U b) {
return (a+b);
}[/mw_shl_code]
所以,现在这将是关于函数模板的。我们现在可以转到类模板。
类模板:
类模板与函数模板相同,只是它们用于处理类。类模板在处理堆栈、树、图形等数据结构时非常有用。这里的成员可以使用模板参数作为类型。
在下面的语法中, identifier 是指您为类型指定的名称类声明的语法是:
[AppleScript] 纯文本查看 复制代码 template <class identifier> class classname {....};
Eg:
template <class T> class add_class {.....};
定义类的成员函数:
[AppleScript] 纯文本查看 复制代码 template <class identifier> identifier classname <identifier> :: function_name() {.....}
Eg:
template <class T> T add_class <T> :: sum() {....}
要创建具有特定数据类型的类对象:
[AppleScript] 纯文本查看 复制代码 classname <datatype> object;
Eg:
add_class <int> obj1;
我们可以使用与函数模板中使用的相同的加法示例。在这里,我们创建一个类添加:
[AppleScript] 纯文本查看 复制代码 template <class T>
class add {
T a,b;
public:
T add(T first,T second)
{ a=first; b=second; }
T sum()
{ return(a+b); }
};
上面,我们使用类添加。它有两个元素 a 和 b,它们是模板参数类型。我们必须稍后定义它。有一个构造函数为 a 和 b 赋值(因为 a 和 b 是私有的,我们必须使用这个构造函数)。还有一个成员函数 sum() 返回 a 和 b 的总和。
现在让我们看看 main 函数中实际添加两个整数和两个浮点数的代码。
[AppleScript] 纯文本查看 复制代码 add <int> obj1(2,3);
add <float> obj2(10.3,6.2);
int res1 = obj1.sum();
float res2 = obj2.sum();
cout<<"Integer sum = "<<res1;
cout<<"nFloat sum = "<<res2;
在上面的代码中,我们创建了两个对象,obj1 和 obj2。obj1 是整数类型,obj2 是浮点数。也就是说,obj1 的元素 a 和 b 是整数,而 obj2 的元素是浮点数。我们使用构造函数在对象创建期间用值初始化 a 和 b。其余的代码很简单,如果您一直阅读本文,您就会理解它。
关于模板还有更多要谈的,但现在,我有点累了。所以,我们将在这里结束我们的文章。关于模板还有更多要讨论的内容,但我们稍后会研究。模板使编程变得通用,从而使生活更轻松。C++ 中有标准模板库,它提供了许多预定义的类型,如堆栈、队列等
[这是 cprogramming.com 关于 STL 的一小段]
C++ 标准的最新版本之一是标准模板库 (STL)。STL 是一组抽象数据类型、函数和算法,旨在处理用户指定的数据类型。每个抽象数据类型还包含有用的函数,包括重载运算符,以访问它们。标准模板库的精神是泛型编程的思想——算法或数据结构的实现,而不依赖于所处理的数据类型。例如,您可以使用 STL 向量容器来存储您想要的任何对象的向量(将其视为可调整大小的数组)。在 C 和非 STL C++ 中,您可以使用数组来获得类似的功能,但数组仅限于单一类型的数据结构。此外,STL 提供了一些不错的功能,例如为您处理内存(无内存泄漏),
希望你们喜欢这个教程,就给我回复一下你的意见,我们一起交流,我是by鬼神,中国红客联盟 |