筆記** : 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 深陷 之 模板 乙...