您的位置:首页 > 编程语言 > C语言/C++

C++ 函数模板,类模板初步认识

2018-01-05 15:19 330 查看

一、函数模板

1、几个功能相同的函数,比如都是两个数相加,只是参数类型不同(float+float; int+int等)就可以用一个模板函数,简化代码;

2、模板定义:

语法:

template  <typename 虚拟类型名称> 函数返回值  函数名称 (参数列表){函数体}

或者

template  <class 虚拟类型名称> 函数返回值  函数名称 (参数列表){函数体}

例如:

//函数模板  
template <typename I>   //typename I  和 class  I  一样的作用
I add(I a, I b)
{
    return a+b;
}

 template <typename I>    template   <typename[class] 虚拟类型名称>

I add(I a, I b)  //函数返回类型  函数名 (参数1,......)

{

return a+b;

}  //函数体

3、函数模板的使用

cout<<add(5,5)<<endl<<add(5.2,5.2)<<endl;//

//cout<<add(5,5.2)<<endl;//5和5.2   不明确类型语法有错误
/*
F:\mystudy\classtemplate\classtemplate\classtemplate\classtemplate.cpp(32) : error C2782: “I add(I,I)”: 模板 参数“I”不明确
f:\mystudy\classtemplate\classtemplate\classtemplate\classtemplate.cpp(9) : 参见“add”的声明
可能是“double”
或       “int”
*/
//cout<<add((int)5.2, 5.2); //同上不明确
cout<<add(5,(int)5.2)<<endl;//这种格式就比较明确
cout<<add((double)5,5.2)<<endl;


二、类模板

1、类模板声明格式

template <class 虚拟类型参数>
class  类名
{
//类体
构造函数
函数返回值   函数名(虚拟类型参数名)

};
即:

template <class T>
class  A
{
//类体 

public://

A();//构造函数
void test(T a);//函数返回值   函数名(虚拟类型参数名)

};
#ifndef TEMP
#define TEMP

//类模板(Class templates)

/*
1) 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。

2) 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如下例中的T)。

3) 在类声明前面加入一行,格式为:
template <class 虚拟类型参数>
如:
template<class T>
class A//A 类型名称
{
public:
T g(T a, T b);
A();
}; //类体
*/

template<class T>
class A//A 类型名称
{
public:
T g(T a, T b);
A();
};

#endif
//template<class T> A<T>   类型名称
template<class T>
A<T>::A()
{

}

template <class T> //类模板格式
T A<T>::g(T a, T b)  //T 函数返回值
{
return a+b;
}


2、类模板函数的定义

    template<class T> 类型名称::函数名称(参数列表)
    {
        函数体。。。

    }
   即:

4000
    template<class T> A<T>::A()
   {
    }

//template<class T> A<T>   类型名称
template<class T>
A<T>::A()
{

}

template <class T> //类模板格式
T A<T>::g(T a, T b)
{
return a+b;
}
3、对象定义格式
    类模板名<实际类型名> 对象名; 

    类模板名<实际类型名> 对象名(实参表列); (构造函数有参数定义格式)

   
A<int> t; //此处定义了T的类型为整型,所以类型明确没有语法错误

//A b; // 1,error C2955: “A”: 使用类 模板 需要 模板 参数列表 2,error C2133: “b”: 未知的大小 3,error C2512:
// “A”: 没有合适的默认构造函数可用
//b.g(5,5); error C2662: “A<T>::g”: 不能将“this”指针从“A”转换为“A<T> &”
/* 对象定义格式
类模板名<实际类型名> 对象名; A 对应 类模板名 <int> 对应 <实际类型名> t 对应对象名 A<int> t;
类模板名<实际类型名> 对象名(实参表列); 构造函数有参数定义格式
*/
4、类模板成员函数使用

对象.方法(参数);   

A<int> t;
t.g(5.6,5.2); // 11

//此处定义了T的类型为整型,所以类型明确没有语法错误;就算你给的参数是float  也会按照int解释

使用和类一模一样;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: