模板_template

模板引入的类型抽象是泛型程序设计的基础,具体为函数模板和类模板。

函数模板

语法:

template<typename T,typename S>
//每个模板类型形参前面必须带上关键字 class 或 typename
void my_swap(T &a,S b){
    T temp = a;
    a = b;
    b = temp;
}

函数模板调用

    int a = 20;
    int b = 10;
    char c = 97;
    char d = 98;
    my_swap(a,b);//自动匹配,类型必须完全一致
    my_swap(a,d);//不可以,由于 int &p = c 不允许。
    my_swap<int,char>(a,b);//显示调用模板函数。
练习

实现排序的模板函数(包括整形数,字符型和类类型)
参考代码如下:

//模板函数部分:
template<typename T>
int bubble_Sort(T *arr,int len){
    if(NULL == arr){
          throw invalid_argument("指针为空");
    }
    for(int i = 0;i<len;i++){
        for(int j = 0;j<len-i-1;j++){
            if(arr[j]<arr[j+1]){
                T t;
                t = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = t;
            }
        }
    }
}

template<typename T>
void print_arr(T *arr,int len){
    if(NULL == arr){
          throw invalid_argument("指针为空");
    }
    for(int i=0;i<len;i++){
        cout<<arr[i]<<endl;
    }
}

//类类型
class Person{
public:
    Person(string name = "zhangsan",int age = 23):m_name(name),m_age(age)
    {
    }
    void setMsg(string name ,int age ){
        this->m_name = name;
        this->m_age = age;
    }
    //是否需要其他函数。
    //重载<
    bool operator <(Person &p){
        if(this->m_age<p.m_age){
            return false;
        }
        return true;
    }

    //重载=
    Person& operator=(Person &p){
        this->m_age = p.m_age;
        this->m_name = p.m_name;
    }

    friend ostream& operator <<(ostream& out,Person &p){
        out<<p.m_name<<endl<<p.m_age<<endl;
        return out;
    }
private:
    string m_name;
    int m_age;
};

//main函数测试代码
    int arr[]={10,23,2,45};
    int size_int = sizeof(arr)/sizeof(int);
    int *p = NULL;
    try{
        bubble_Sort<int>(arr,size_int);
    }
    catch(exception &e){
        cout<<e.what()<<endl;
    }

    try{
       print_arr<int>(arr,size_int);
    }
    catch(exception &e){
        cout<<e.what()<<endl;
    }

    //1、
    Person *p = new Person[3];//调用5次无参构造函数
    p[0].setMsg("test",20);
    p[1].setMsg("test1",10);
    p[2].setMsg("test2",40);

    //2、
    Person array[] = {{"test",20},{"test1",10},{"test2",40}};

    //3、
    Person p1("test",20);
    Person p2("test1",10);
    Person a[]={p1,p2};

    cout<<"********************"<<endl;
    try{
        bubble_Sort<Person>(p,3);
    }
    catch(exception &e){
        cout<<e.what()<<endl;
    }

    try{
       print_arr<Person>(p,3);
    }
    catch(exception &e){
        cout<<e.what()<<endl;
    }

模板类

1、定义:

template<typename TYPENAME,typename TYPEAGE>
class Student{
public:
     Student(){}
    Student(TYPENAME name ,TYPEAGE age)
        :m_name(name),m_age(age)
    {
    }
    void showMsg(){
        cout<<this->m_name<<this->m_age<<endl;
    }
private:
    TYPENAME m_name;
    TYPEAGE m_age;
};

2、模板类对象的传参方式

//方式1
template<typename T,typename S>
void dowork(Student<T,S>&p)
{
    p.showMsg();
}
//方式2
template<typename T>
void dowork(T &p)
{
    p.showMsg();
}
//方式3
void dowork(Student<string,int>&p)
{
    p.showMsg();
}

3、模板类派生类(派生模板类)

class stu:public Student<string,int>{//父类必须指定具体的类型
private:
    string m_sex;
};
//派生模板类
template<typename T,typename S>
class stu:public Student<T,S>{
public:
    stu(T name ,S age,T sex):Student<T,S>(name,age),m_sex(sex){}
private:
    T m_sex;
};

4、模板类中的static变量

     Student<string,int>p("zhangsan",52            
    dowork(p);    
                           ------- >static int a = 30
    Student<string,int>p1("wang",42);
    p1.showMsg();
                           ------- >static int a = 30
    Student<string,char>p2("wang",42);
    p2.showMsg();
                           ------- >static int a = 10
//p和p1不属于同一个类族。

5、模板类的多文件实现

template<typename TYPENAME,typename TYPEAGE>
class Animal{
public:
    Animal(TYPENAME name ,TYPEAGE age );
    void setMsg(TYPENAME name ,TYPEAGE age );
    bool operator <(Animal &p);
    Animal<TYPENAME,TYPEAGE>& operator=(Animal &p);
    void show(){
        cout<<this->m_name<<endl<<this->m_age;
    }
    template<typename T1,typename T2>
    friend void display(Animal<T1,T2> &p, T1 name);
//    friend ostream& operator <<(ostream& out,Animal &p);
private:
    TYPENAME m_name;
    TYPEAGE m_age;
};

#include "header1.h"

template<typename TYPENAME,typename TYPEAGE>
void display(Animal<TYPENAME,TYPEAGE> &p,TYPENAME name){
    p.m_name = name;
}

template<typename TYPENAME,typename TYPEAGE>
Animal<TYPENAME,TYPEAGE>::Animal(
        TYPENAME name = "zhangsan",TYPEAGE age = 23)
    :m_name(name),m_age(age)
{
}

template<typename TYPENAME,typename TYPEAGE>
void Animal<TYPENAME,TYPEAGE>::setMsg(TYPENAME name ,TYPEAGE age){
    this->m_name = name;
    this->m_age = age;
}

template<typename TYPENAME,typename TYPEAGE>
bool Animal<TYPENAME,TYPEAGE>::operator <(Animal &p){
    if(this->m_age<p.m_age){
        return false;
    }
    return true;
}

template<typename TYPENAME,typename TYPEAGE>
Animal<TYPENAME,TYPEAGE>& Animal<TYPENAME,TYPEAGE>::operator=(Animal &p){
    this->m_age = p.m_age;
    this->m_name = p.m_name;
}
实现数组模板类

能够管理整形,字符型和student类类型的数据。
完成运算符重载 [] << =等
要求:模板类分文件实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容