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解释
使用和类一模一样;
相关文章推荐
- 对C++ 的模板初步认识
- 对C++中模板的实例化的机制的认识
- 写模板string类, 认识STL的模块分离策略----小话c++(7)
- C++中函数模板和类模板
- C++基础学习笔记----第十一课(类的静态成员、对象模型初步认识)
- [置顶] C++(函数模板的覆盖 包括:处理私有类的函数模板覆盖)
- 对C++模板的新认识
- C++ 模板学习 函数模板、类模板、迭代器模板
- c++初步认识
- C++学习 【1】 C++的初步认识
- 对C++中为模板定义特殊的实现的认识
- c++的函数模板和类模板
- FreeMarker学习笔记(一) 初步认识Freemarker的模板
- C++游戏之GDI的初步认识与使用(二)
- C++中的简单内存管理---初步认识
- C++ 类模板作为函数模板示例
- 初步认识c++
- C++模板的认识(一)函数模板
- c/c++基础(十四) 初步认识gcc
- c++ 模板学习笔记:类模板和函数模板实现pair(权哥)