<C/C++基础> 类模板
来源:互联网 发布:数据库生产商 编辑:程序博客网 时间:2024/04/19 23:30
本文目的:理解并掌握类模板
参考资源:c++ primer
模板是一个非常有用的东西,可以让我们写一次代码产生出不同的版本以应对不同的数据类型,原理是在具体调或者是在编译时产生不同的版本。类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。
使用格式为:
template<class T> or template<typename T>
这里的class与typename 没有区别,前者要老一些,后者更直观一点的表明后面跟的是个类型名。
一,函数模板:例:
template<class T> compare( const T &a, const T &b){ }
说明:模板声明中跟在class and typename 后面的叫类型形参,跟在其它声明比如 int 或是其它自定义类型后面的叫作非类型形参。
使用函数模板时可以直接调用如:compare(1,3);编译器会自动生成相应的版本。
inline 模板函数的声明中inline 要放在<>后,如:
template<class T> inline T compare( const T &a, const T &b){ }
模板函数简单举例1:
#include "StdAfx.h"#include <iostream> using namespace std; template<typename T> //模板声明,其中T为类型参数 T max(T a,T b,T c) //定义一个通用函数,用T作虚拟的类型名 { //这个函数所有参数以及返回值均是T类型if(b>a) a=b; if(c>a) a=c; return a; } int main( ){int i1=185,i2=-76,i3=567,i; double d1=56.87,d2=90.23,d3=-3214.78,d; long g1=67854,g2=-912456,g3=673456,g; i=max(i1,i2,i3); //调用模板函数,此时T被int取代 d=max(d1,d2,d3); //调用模板函数,此时T被double取代 g=max(g1,g2,g3); //调用模板函数,此时T被long取代 cout<<"i_max="<<i<<endl; cout<<"f_max="<<d<<endl; cout<<"g_max="<<g<<endl; system("pause");return 0; }
模板函数简单举例2:
#include "iostream"using namespace std;template<class T>void PrintArray(T *Array,int count){for(int i=0;i<count;i++)cout<<Array[i]<<" ";cout<<endl;}int main(){int a[5]={1,2,3,4,5};double b[7]={1.1,2.2,3.3,4.4,5.5,6.6,7.7};char c[6]="HELLO";PrintArray(a,5);PrintArray(b,7);PrintArray(c,6);system("pause");return 0;}
二,类模板:
//1. 标准模板类。 template<typename T1, typename T2> class MyClass { ... ... }; //2. 两个模板参数具有相同类型的部分特化类。 template<typename T> class MyClass<T,T> { ... ... } //3. 第二个类型参数是int template<typename T> class MyClass<T,int> { ... ... } //4. 两个模板参数都是指针。 template<typename T1,typename T2> class MyClass<T1*,T2*> { ... ... } //5. 两个模板参数都是相同类型的指针。 template<typename T> class MyClass<T*,T*> { ... ... } //6. 调用示例代码。 int main() { MyClass<int,float> c1; //调用MyClass<T1,T2> MyClass<float,float> c2; //调用MyClass<T,T> MyClass<float,int> c3; //调用MyClass<T,int> MyClass<int*,float*> c4; //调用MyClass<T1*,T2*> MyClass<int*,int*> c5; //调用MyClass<T*,T*> return 0; }
类模板简单举例1:
#include "StdAfx.h"#include <iostream>using namespace std;template <typename T>class classOne{private:T a;public:T get(T b){a=b*b;//平方化return a;}};template <typename TT>class classTwo{private:classOne<TT> test;//在类classTwo中声明成员变量,意在调用通过此成员变量调用另一个类的成元函数public:TT out(TT b){return test.get(b);}};int main(){classTwo<double> test2;//传过去cout<<test2.out(3.2)<<endl;system("pause");return 0;}
类模板的使用与函数模板有所不同,在调用类模板时必须显式的指定类型形参T,如我们定义的A的使用:
A< int > ai;
A< char > ac;
A< vector<double> > av;
A< string > as;
(1)关于形参,模板形参在其作用域中会屏蔽掉全局参数。
(2)形参的名字不能在模板内部重用,也就是说一个名字在一个模板中只能使用一次:
template<class u, class u> //error
但是可以这样(多个类型参数)
template <class T1, typename T2>
(3)模板的声明和定义中参数的名字可以不同如:
声明:
template<class U>
class A
定义:
template<class T>
class A{}
- 【基础C&C++】模板
- <C/C++基础> 类模板
- 【c/c++】类模板
- 【C/C++】模板类
- C/C++:函数模板与类模板
- [C/C++]模板函数与模板类
- 【c++】模板和模板类
- c++vector模板类
- c++vector模板类
- c++:类模板
- [C++]类模板
- C++:类模板
- 【c++】类模板
- C++stack模板类
- C++-模板
- C++-模板
- C++:模板
- C++:模板
- 华为编程大赛——24点游戏
- 东软学习,基于socket的多线程编程
- 指针基本知识
- google test,libgtest.a和libgtest_main.a的链接顺序问题
- UITextField监听事件
- <C/C++基础> 类模板
- 【HDU】3657 Game 最小割
- POJ 1966 Cable TV Network | 最小点割集、最小割
- 云计算之初识
- c++ 函数 内存问题
- 核密度估计(kernel density estimation,KDE)
- Storm源码结构 (来源Storm Github Wiki)
- Python多线程自动刷票脚本
- 美美的人生