C++入门经典-例9.1-函数模板,函数模板的作用,使用数组作为模板参数

1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码。定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能。

2:函数模板定义的一般形式如下:

template <类型形式参数> 返回类型 函数名(形式参数表)

{

...//函数实现

}

其中template为关键字,表示定义一个模板,尖括号“<>”中为模板参数,模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数。上述代码中定义的模板使用的是模板类型参数,模板类型参数使用关键字class或typedef开始,其后是一个用户自定义的合法标识符。模板非类型参数和普通参数定义相同,通常为一个常数。

可以将声明函数模板分成template部分和函数名部分。例如:

template <class T>

void fun(T t)

{

...//函数实现

}

例如,下面的代码定义了一个求和的函数模板:

template <class type>//定义一个模板类型

type Sum(type xvar,type yvar)

{

return xvar+yvar;

}

在定义完函数模板之后,需要在程序中调用函数模板。下面的代码演示了Sum函数模板的调用。

int iret=Sum(10,20);//实现两个整数的相加

double dret=Sum(10,20.5);//实现两个实数的相加

如果采用如下的形式调用Sum函数模板,将会出现错误。

int iret=Sum(10.5,20);//错误的调用

double dret=Sum(10,20.5);//错误的调用

上述代码中为函数模板传递了两个类型不同的参数。导致编译器产生了歧义。如果在调用函数模板时显示表示模板类型就不会出现错误。例如:

int iret=Sum<int>(10.5,20);//正确地调用函数模板

double dret=Sum<double>(10,20.5);//正确地调用函数模板

用函数模板生成实际可执行的函数又称为模板函数。函数模板与模板函数不是一个概念。从本质上讲,函数模板是一个“框架”,它不是真正可以编译生成代码的程序,而模板函数是把函数模板中的类型参数实例化后生成的函数,它和普通函数本质上是相同的,可以生成可执行代码。

3:函数模板的作用

时间: 2024-10-13 11:52:48

C++入门经典-例9.1-函数模板,函数模板的作用,使用数组作为模板参数的相关文章

C++入门经典-例5.8-使用指针函数进行运算

1:函数指针式指向函数内存的指针,一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数. 一个函数可以返回一个整数型值.字符值.实型值等,也可以返回指针型的数据,即地址,返回值的类型是指针类型.返回指针值得函数简称指针函数. 定义指针函数的一般形式为: 类型名 *函数名(参数列表) 例如,定义一个具有两个参数和一个返回值的函数的指针及一个具有同样返回值参数列表的函数的代码如下: int sum(int x,inty);

C++入门经典-例5.7-调用自定义函数交换两变量值,传入指针

1:代码如下: // 5.7.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void swap(int *a,int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; } void swap(int a,int b) { int tmp; tmp=a; a=b; b=tmp; } void main() { int x,y;

C++入门经典-例6.15-通过字符串函数连接两个字符数组

1:代码如下 // 6.15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void main() { char str1[50], str2[30], *p1, *p2; p1 = str1; p2 = str2; cout << "please input string1:" << endl; gets_

C++入门经典-例9.3-类模板,简单类模板

1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类模板可以说是用类生成类,减少了类的定义和数量. 2:类模板的一般定义形式如下: template <类型形式参数表> class 类模板名 { ...//类模板体 } 类模板成员函数的定义形式如下: template <类型形式参数表> 返回类型 类模板名 <类型名表>::

C++入门经典-例9.6-有界数组模板,数组下标的越界警告

1:C++语言不能检查数组下标是否越界,如果下标越界就会造成程序崩溃,而程序员在编辑代码时很难找到下标越界错误.那么如何能使数组进行下标越界检测呢?此时可以建立数组模板,在定义模板时对数组的下标进行检查. 在模板中想要获取下标值,需要重载数组下标运算符"[]",重载数组下标运算符后使用模板类实例化数组,就可以进行下标越界检测了.例如: #include <cassert> template <class T,int b> class Array { T&

C++入门经典-例7.3-析构函数的调用

1:析构函数的名称标识符就是在类名标识符前面加"~".例如: ~CPerson(); 2:实例代码: (1)title.h #include <string>//title是一个类,此为构造了一个类 #include <iostream> using std::string; class title{ public: title(string str);//这是一个构造函数 title();//这是一个无参构造函数 ~title();//这就是一个析构函数,执行

C++入门经典-例8.2-构造函数的访问顺序

1:父类和子类中都有构造函数和析构函数,那么子类对象在创建时是父类先进行构造还是子类先进行构造?同样,在子类对象释放时,是父类先进行释放,还是子类先进行释放?这都是有先后顺序的.答案是当从父类派生一个子类并声明一个子类的对象时,它将先调用父类的构造函数,然后调用当前类的构造函数来创建对象:在释放之类对象时,先调用的是当前类的析构函数,然后是父类的析构函数. 2:实例代码如下: // 8.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #inc

C++入门经典-例9.4-默认模板参数

1:默认模板参数就是在类模板定义时设置类型形式参数表中的一个类型参数的默认值,该默认值是一个数据类型.有了默认的数据类型参数后,在定义模板的新类型时就可以不进行指定.代码如下: // 9.4.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; template <class T1,class T2 = int> class MyTemplate

C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数

1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并不是所有代码都是由软件构造师自己写的,有时候需要调用库函数,有时候分给别人写.一名软件构造师可以通过纯虚函数建立接口,然后让程序员填写代码实现接口,而自己主要负责建立抽象类. 2:纯虚函数 纯虚函数是指被标明为不具体实现的虚成员函数,它不具备函数的功能.许多情况下,在基类中不能给虚函数一个有意义的定