c++模板

来源:互联网 发布:移动办公软件排名 编辑:程序博客网 时间:2024/06/12 01:25

函数模板与模板函数
函数模版实现了函数参数的通用性,作为一种代码的重用机制,可以大幅度低提高程序设计的效率。

#include<iostream>using namespace std;template<typename T>T max(T a,T b){    cout<<"调用模板函数";    return (a>b)?a:b;}int max(int a,int b)//定义非模板函数,与函数模版max重载 {    cout<<"调用非模板函数:";    return (a>b)?a:b;}int main(){    int i1=12,i2=56;    double c1=45.3,c2=56.3;    char d1='k',d2='m';    cout<<"较大的整数是:"<<max(i1,i2)<<endl;    cout<<"较大的双精度浮点数是:"<<max(c1,c2)<<endl;    cout<<"较大的字符型数是:"<<max(d1,d2)<<endl;    return 0;}

1、函数模版与同名的非模板函数可以重载,调用顺序为:首先寻找一个参数完全匹配的非模板函数,如果找到了就调用它,如果没有找到就寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了就调用它。
2.函数被重载的时候,在每个函数体内可以执行不同的操作,但同一函数模版实例化后的所有模板函数都必须执行相同的操作。
3.template语句与函数模板定义语句之间不允许有别的语句。
如:
template
int i;
T max(T a,T b)
就是错误的,不能编译

类模板与模板类

#include<iostream>using namespace std;template<typename T>class compare{    public:        compare(T a,T b)        {            x=a;            y=b;        }        T max()        {            return x>y?x:y;        }        private:            int x,y;};int main(){    compare<int> com1(12,4);    compare<double> com2(23.4,45.7);    compare<char> com3('h','f');    cout<<"最大值为:"<<com1.max()<<endl;    cout<<"最大值为:"<<com2.max()<<endl;    cout<<"最大值为:"<<com3.max()<<endl;    return 0;}

如果要在类模板体外定义类模板中的成员函数,规定:
1、需要在成员函数定义之前进行模板声明
2、在成员函数名前缀上“类名<类型参数>::”
如:

#include<iostream>using namespace std;template<typename T>//模板声明,T为类型参数 class compare//类模板名为compare {    public:        compare(T a,T b);//声明构造函数的原型         T max();//声明成员函数为max的原型         private:            int x,y;};template<typename T>//模板声明 compare<T>::compare(T a,T b)//在类模板体外定义构造函数 {    x=a;    y=b;}template<typename T>T compare<T>::max()//在类模板体外定义成员函数max,返回类型T {    return x>y?x:y;}int main(){    compare<int> com1(12,4);    compare<double> com2(23.4,45.7);    compare<char> com3('h','f');    cout<<"最大值为:"<<com1.max()<<endl;    cout<<"最大值为:"<<com2.max()<<endl;    cout<<"最大值为:"<<com3.max()<<endl;    return 0;}

模板类可以有多个类型参数,如:

#include<iostream>using namespace std;template<typename T1,typename T2>class Myclass{    public:        Myclass(T1 a,T2 b)        {            i=a;            j=b;        }        void show()        {            cout<<"i="<<i<<",j="<<j<<endl;        }        private:            T1 i;            T2 j; }; int main() {    Myclass<int,double> m1(12,45.6);    Myclass<int,char> m2(12,'h');    m1.show();    m2.show();    return 0; }
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 结婚请婚庆公司要多少钱 结婚需要买什么东西 结婚需要买什么 结婚酒席费用 结婚登记需要多少钱 法定婚龄 关于婚姻 婚礼的英文 朴昭妍吴钟赫结婚 韩高恩朴俊亨结婚 萧子升与陶斯咏结婚 结多音字组词 结多音字 结多音字组词语 结组词多音字组词 结字组词 结字拼音 结字多音字组词 结字多音字组词语 结是不是多音字 结是多音字 结组词多音字 结字 结的多音字组词和拼音 带五字的结拜称号 二人结拜称号必须带一个二字 结字开头的成语 结的多音字组词和拼音怎么写 倩女二人结拜称号带二字的 中国结福字编法 结是多音字吗 多音字结的读音和组词 结的多音字组词语 中国结福字 结的多音字组词 结的多音字 一根线t字结串钩图解 优雅的四个字结拜名字 福字中国结 多音字组词大全 教师工作业绩简结100字