C 類模板在不同情況下的使用

2021-10-06 17:01:23 字數 4340 閱讀 4122

4. 類模板派生普通類

5. 類模板派生類模板

6. 類模板類內實現

7. 類模板類外實現

8. 模板類碰到友元函式

類模板和函式模板的定義和使用類似。

有時,有兩個或多個類,其功能是相同的,僅僅是資料型別不同。

類模板可以有預設引數,比如:

template

<

typename nametype,

typename agetype=

int>

而函式模板不支援有預設引數

類模板不能進行型別自動推導:

template

<

typename nametype,

typename agetype>

class

person

void

showperson()

public

: nametype mname;

agetype mage;};

void

test01()

class

person1};

class

person2};

template

<

typename t>

class

myclass

void

func2()

};//類模板中成員函式 一開始不會建立出來,而是在執行時才去建立

void

test01()

//類模板

template

<

typename nametype,

typename agetype>

class

person

void

printperson()

public

: nametype mname;

agetype mage;};

//類模板做函式引數

void

dobussiness

(personint>

& p)

intmain()

函式模板內套類模板,用函式模板的可以自動推導型別的特點

檢視型別名稱:typeid(t).name()

//類模板

template

<

typename nametype,

typename agetype>

class

person

void

printperson()

public

: nametype mname;

agetype mage;};

template

<

typename t1 ,

typename t2>

void

dowork2

(person

& p)

void

test02()

把整體型別模板化,讓函式模板自動推導

template

<

typename t>

void

dowork3

(t&p)

void

test03()

子類例項化的時候需要具體化父類的型別,子類需要知道父類的具體型別是什麼樣的,這樣c++編譯器才能知道給子類分配多少記憶體

//父類類模板

template

<

typename t>

class

base

;class

child1

:public base<

double

>

;void

test02()

繼承類模板的時候,必須要確定基類的大小

//父類類模板

template

<

typename t>

class

base

;template

<

typename t1 ,typename t2>

class

child2

:public base

;void

test02()

類內實現就是上面寫的普通的類模板

template

<

typename nametype,

typename agetype>

class

person

void

showperson()

public

: nametype mname;

agetype mage;};

void

test01()

類模板的類外實現是為了方便分檔案,但是一般我們寫了類模板之後不要進行分檔案編寫,寫到同乙個檔案中,進行宣告和實現,字尾名改為.hpp

#include

#include

using

namespace std;

template

<

typename t1,

typename t2>

class

person

;//類外實現

template

<

typename t1,

typename t2>

person

::person

(t1 name, t2 age)

template

<

typename t1,

typename t2>

void person

::showperson()

void

test()

intmain()

#include

using

namespace std;

#include

//告訴編譯器這個函式模板是存在的同時也要告訴編譯器這個函式模板中用的類也是存在的

template

<

typename t1,

typename t2>

class

person

;//告訴編譯器這個函式模板是存在

template

<

typename t1,

typename t2>

void

printperson2

(person

& p)

;//友元函式在類內實現

template

<

typename t1,

typename t2>

class

person

//2.友元函式類外實現

//告訴編譯器這個函式模板是存在

friend

void printperson2<

>

(person

& p)

;//<>表示這是個模板

//3. 類模板碰到友元函式模板

template

<

typename u1,

typename u2>

friend

void

printperson

(person

& p)

;public

:person

(t1 name, t2 age)

void

showperson()

private

: t1 mname;

t2 mage;};

void

test01()

// 類模板碰到友元函式

//友元函式類外實現 加上<>空引數列表,告訴編譯去匹配函式模板

template

<

typename t1,

typename t2>

void

printperson2

(person

& p)

void

test02()

intmain()

Block 在不同情況下的變數儲存區域

一.如果只使用全域性或靜態變數或不使用外部變數,那麼block塊的 會儲存在全域性區 二.如果使用了外部變數,在arc中,block塊的 會儲存在堆區 在mrc中,block快的 會儲存在棧區 三.block預設情況下不能修改外部變數,只能讀取外部變數 在arc中,外部變數存在堆中,這個變數在blo...

不同情況下this的指向以及改變this指向的方法

1.call 有多個引數,第乙個引數是改變的this指向,剩餘的引數是實參 fn.call fn2,12,5,8 在fn中 this代表的是fn2 12,5,8 代表是fn的實參 有兩個引數,第乙個引數是改變的this的指向,第二個引數,形式是陣列的形式,放的是函式的實參 在fn中,this指的是f...

不同情況下構造skb資料報的實現

在我這個網路介面的程式中 can0 其實難點就是怎樣組包。怎樣在原來資料報的基礎加上自己的資料,怎樣構造ip頭,怎樣構造udp頭。除錯了兩個星期,終於是調通了,在這個過程中,通過看核心源 和自己組包的嘗試,大概對組包的方法有了些了解,記錄在此,留做備忘,也希望能給需要這方面資訊的朋友一點幫助吧。1,...