STL之類模板

2021-10-05 07:49:58 字數 3266 閱讀 6990

筆記** : b站黑馬程式設計師

template

//template 宣告建立模板

//typename 表明其後面的符號是一種資料型別,可以用class代替

//t 通用的資料型別,名稱可以替換,通常為大寫字母

template

class person

void

showperon()

nametype m_name;

agetype m_age;};

void

test()

1.類模板沒有自動型別推導的使用方式

2.類模板在模板引數列表中可以有預設引數

//上乙個案例中:    

person p1

("jack",99

);// 這樣是錯的 , 因為類模板不能自動推導型別

personint>p1(

"jack",99

);//這樣顯式指定型別才可以

//但是可以像這樣指定預設引數(只有類模板才可以這樣用)

templateint>

//這樣在下面使用的時候就可以省略指定的型別了

類模板中成員函式和普通類中成員函式建立時機是有區別的:

普通類中的成員函式一開始就可以建立

類模板中的成員函式在呼叫時才建立

//1. 指定傳入型別(實際開發中最常見)

//2. 引數模板化

//3. 整個類模板化

template

class person

void

showperson()

t1 m_name;

t2 m_age;};

//1. 指定傳入型別

void

printperson1

(personint>

&p)void

test1()

//2. 引數模板化

template

//在這裡告訴編譯器有t1和t2兩種型別

void

printperson2

(person

&p)void

test2()

//3. 整個類模板化

template

void

printperson3

(t& p)

void

test3()

當子類繼承的父類是乙個類模板時,子類在宣告的時候,要指定出父類中的型別如果不指定,編譯器無法給子類分配記憶體

如果想靈活指定出父類中t的型別,子類也需變為類模板

template

class base

;class son : public base<

int>

;//這裡如果要繼承,必須在base裡指定base的t所代表的型別

//侷限性 : 只能是乙個指定的型別

template

class base

;template

//這裡t1給了子類,在子類中使用, t2傳給了父類

class son : public base

;//子類使用模板就可以了

void

test()

//建構函式類外實現

template

person

::person(t1 name,t2 age)

//模板引數列表始終在冒號的前面

template

class person

;//建構函式的類外實現

template

person::

person

(t1 name, t2 age)

;//成員函式的類外實現

template

void person::

showperson()

void

test()

解決:

解決方式1:直接在main裡包含.cpp原始檔而不是.h

解決方式2:將宣告(.h)和實現(.cpp)寫到同乙個檔案中,並更改字尾名為,hpp,hpp是約定的名稱,並不強制

// person.hpp

#include

using namespace std;

template

class person

;template

person::

person

(t1 name, t2 age)

template

void person::

show()

// main.cpp

#include

"person.hpp"

void

test()

intmain()

全域性函式類內實現·直接在類內宣告友元即可

全域性函式類外實現·需要提前讓編譯器知道全域性函式的存在

//全域性函式類內實現

template

class person

friend void

show

(personp)

;private:

t1 m_name;

t2 m_age;};

intmain()

//全域性函式類外實現

//提前讓編譯器知道有乙個模板類person存在

template

class person;

//提前讓編譯器知道模板類person的全域性友元函式存在

template

void

show

(personp)

template

class person

friend void show<

>

(personp)

;//show後面加上<>表示空的模板引數列表

private:

t1 m_name;

t2 m_age;};

intmain()

c 模板之類模板

函式木板比較簡單,就是把函式涉及到的型別都暫時寫成乙個t,然後呼叫的時候,給出具體的引數型別,這時候就會例項化出乙個新的函式,類模板意思差不多,就是把類裡面涉及到的型別暫時寫成乙個t,然後就可以例項化的時候傳遞乙個型別,不過類模板,要顯示的傳遞型別 include using namespace s...

模板之型別萃取

函式類模板萃取主要針對的是含有自定義型別的函式 我們的型別函式如果需要拷貝往往可以通過給定庫函式經行萃取,但是尼?我們的型別函式型別中每乙個變數中含有的成員個數都是不知道的,我們就需要另外一種拷貝深拷貝的方式,對我們的自定義型別經行處理。好了,我們定義一種不需要傳遞第三引數的方法型別萃取一下。定義自...

C 深陷 之「類模板」

c 中的模板 template 是泛型程式設計的基礎。乙個模板就是乙個藍圖,用來建立類或函式的藍圖。模板主要分為兩類 函式模板 function template 類模板 class template 本文主要介紹類模板 class template 關於模板的全部內容,參考 c 深陷 之 模板 乙...