c++知識點(diǎn)9模板

模板 Templates
語法格式
template<typename/class 類型參數(shù)表> //一般不用class
返回類型 函數(shù)模板名(函數(shù)參數(shù)列表)
{
函數(shù)模板定義體
}
函數(shù)模板 應(yīng)用條件 1.函數(shù)名相同 2.函數(shù)的參數(shù)個數(shù)相同 3.函數(shù)的參數(shù)類型不同4.函數(shù)體相同

#include<cstring>
#include <iostream>
using namespace std;

template<typename T>
class MyVector{
public:
    MyVector(int size=0);//構(gòu)造
    MyVector(const MyVector&obj);//拷貝
    ~MyVector();//析構(gòu)
    T& operator[](int index);//重新定義[]
    MyVector& operator=(const MyVector&obj);//重新定義=
    template<typename T1>
    friend ostream& operator <<(ostream &out,MyVector<T1> &obj);//重新定義<<
    template<typename T1>
    friend istream& operator >>(istream &in,MyVector<T1> &obj);//重新定義>>
    static int a;//放在私有用set get出來  //兩個不同類型的類模板不共用一個靜態(tài)變量
private:
    T*m_space;
    int m_len;

};
template<typename T>//靜態(tài)變量
int MyVector<T>::a=10;

template<typename T>//每段都要加
MyVector<T>::MyVector(int size)//作用域后都要加<T>
{
   m_len=size;
   m_space=new T[m_len];
   memset(m_space,0,sizeof(T)*m_len);
}
template<typename T>
MyVector<T>::MyVector(const MyVector&obj)
{
    m_len=obj.m_len;
    m_space=new T[m_len];
    for(int i=0;i<m_len;i++)
    {
        m_space[i]=obj.m_space[i];
    }
}
template<typename T>
MyVector<T>::~MyVector()
{
    if(NULL!=m_space)
    {
        delete []m_space;
        m_space=NULL;
        m_len=0;
    }
}
template<typename T>
T& MyVector<T>::operator[](int index)
{
    return m_space[index];
}
template<typename T>
MyVector<T>& MyVector<T>::operator=(const MyVector<T>&obj)
{
    delete[]m_space;
    m_len=obj.m_len;
    m_space=new T[m_len];
    for(int i=0;i<m_len;i++)
    {
        m_space[i]=obj.m_space[i];
    }
    return *this;
}
template<typename T1>
ostream& operator <<(ostream &out,MyVector<T1> &obj)
{
    for(int i=0;i<obj.m_len;i++)
    {
        out<<obj.m_space[i]<<endl;
    }
    return out;
}
template<typename T1>
istream& operator >>(istream &in,MyVector<T1>&obj)
{
    for(int i=0;i<obj.m_len;i++)
    {
        in>>obj.m_space[i];
    }
    return in;
}
#include <iostream>
using namespace std;

class Teacher
{
public:
    Teacher();
    Teacher(const char*name,int age);
    Teacher(const Teacher&obj);
    ~Teacher();
    Teacher& operator =(const Teacher&obj);
    friend ostream&operator <<(ostream&out,const Teacher&obj);
private:
    char *m_name;
    int m_age;

};
Teacher::Teacher()
{
    m_age=0;
    m_name=new char[1];
    strcpy(m_name,"");
}
Teacher::Teacher(const char*name,int age)
{
    m_age=age;
    m_name=new char[strlen(name)+1];
    strcpy(m_name,name);
}
Teacher::Teacher(const Teacher&obj){
    m_age=obj.m_age;
    m_name=new char[strlen(obj.m_name)+1];
    strcpy(m_name,obj.m_name);
}
Teacher::~Teacher()
{
    if(NULL!=m_name)
    {
        delete[]m_name;
        m_name=NULL;
        m_age=0;
    }
}
Teacher& Teacher::operator =(const Teacher&obj)
{
    if(m_name!=NULL)
    {
        delete[]m_name;
        m_name=NULL;
    }
    m_age=obj.m_age;
    m_name=new char[strlen(obj.m_name)+1];
    strcpy(m_name,obj.m_name);
    return *this;
}
ostream&operator <<(ostream&out,const Teacher&obj)
{
    out<<obj.m_name<<" "<<obj.m_age<<endl;
    return out;
}
#include"myvector.h"
#include"teacher.h"
int main()
{

    MyVector<int> a(10);//T=int
    for(int i=0;i<10;i++)
    {
        a[i]=i+100;
    }
//    cin>>a;
    MyVector<int> b(a);
    cout<<b[2]<<b[1]<<endl;
    MyVector<int> c;
    c=a;
    cout<<c[2]<<c[1]<<endl;
    cout<<a<<endl;

    MyVector<Teacher> tech(3);//T=class
    Teacher t1;
    Teacher t2("wangnan",25);
    Teacher t3(t2);
    tech[0]=t1;
    tech[1]=t2;
    tech[2]=t3;
    cout<<tech<<endl;


    MyVector<Teacher*> tech1(3);//T=class*
    tech1[0]=&t1;
    tech1[1]=&t2;
    tech1[2]=&t3;
    cout<<*tech1[0]<<endl;
    cout<<*tech1[1]<<endl;
    cout<<*tech1[2]<<endl;
    return 0;
}

模板定義很特殊森逮。由 template<…> 處理的任何東西都意味著編譯器在當(dāng)時不為它分配存儲空間晓勇,它一直處于等待狀態(tài)直到被一個模板實(shí)例告知稻艰。在編譯器和連接器的某一處,有一機(jī)制能去掉指定模板的多重定義译打。所以為了容易使用,幾乎總是在頭文件中放置全部的模板聲明和定義,文件后綴為.hpp

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市峰鄙,隨后出現(xiàn)的幾起案子灿椅,更是在濱河造成了極大的恐慌套蒂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茫蛹,死亡現(xiàn)場離奇詭異操刀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)婴洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門骨坑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柬采,你說我怎么就攤上這事欢唾。” “怎么了粉捻?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵礁遣,是天一觀的道長。 經(jīng)常有香客問我肩刃,道長祟霍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任树酪,我火速辦了婚禮浅碾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘续语。我一直安慰自己垂谢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布疮茄。 她就那樣靜靜地躺著滥朱,像睡著了一般根暑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徙邻,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天排嫌,我揣著相機(jī)與錄音,去河邊找鬼缰犁。 笑死淳地,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帅容。 我是一名探鬼主播颇象,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼并徘!你這毒婦竟也來了遣钳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤麦乞,失蹤者是張志新(化名)和其女友劉穎蕴茴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姐直,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倦淀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了简肴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晃听。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砰识,靈堂內(nèi)的尸體忽然破棺而出能扒,到底是詐尸還是另有隱情,我是刑警寧澤辫狼,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布初斑,位于F島的核電站,受9級特大地震影響膨处,放射性物質(zhì)發(fā)生泄漏见秤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一真椿、第九天 我趴在偏房一處隱蔽的房頂上張望鹃答。 院中可真熱鬧,春花似錦突硝、人聲如沸测摔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋八。三九已至浙于,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挟纱,已是汗流浹背羞酗。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留紊服,地道東北人檀轨。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像围苫,于是被迫代替她去往敵國和親裤园。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容