C 複習五 泛型程式設計及C 的型別轉換

2021-10-09 04:22:48 字數 4005 閱讀 1075

模板的機制

函式的侷限性

類模板類模板的繼承問題

類外實現模板類的成員函式

類模板的分檔案編寫

類模板和友元函式

c++型別轉換

泛型程式設計是從乙個抽象層面描述一種型別的演算法,不管容器型別是什麼,是一種不同於oop的角度來抽象具體演算法

c++用模板來實現泛型程式設計,模板分為函式模板和類模板

template

<

class

/typename t>

//告訴編譯器遇到t不要報錯

myswap

(t &a, t &b)

//型別引數化,在使用時會進行自動型別推導,將a和b的型別傳給t

myswap<

int>

(a, b)

//顯式指定型別

在使用函式模板時,一定要讓編譯器知道t是什麼型別,否則無法使用

型別轉換

普通函式可以進行隱式型別轉換(顯示表示)

函式模板不可以

呼叫順序

當普通函式對函式模板進行了函式過載時,優先呼叫普通函式,如果普通函式出錯,則出錯,不會再去呼叫函式模板

如果需要強制呼叫函式模板,可以加 <> 來呼叫

函式模板也可以進行函式過載

如果函式模板可以產生更好的匹配,優先呼叫函式模板

模板不能解決所有的型別,可以使用第三代具體化來實現

//函式模板

template

<

class

t>

bool

mycompare

(t &a, t&b)

return

false;}

//第三代具體化,如果能直接匹配,就優先呼叫

template

bool mycompare

(person &a, person &b)

return

false

;}

template

<

class

nametype

,class

agename

=int

>

//可以有預設型別引數

class

person

nametype m_name;

agetype age;};

personint>p(

"heihei"

,100);

//函式模板可以進行自動型別推導,而類模板不行

類模板的成員函式在未確定時不會建立,只有確認了才會建立

template

<

class

nametype

,class

agetype

>

class

person

nametype m_name;

agetype m_age;};

void

dowork

(personint>

&p)

引數模板化
template

<

classt1,

class

t2>

void

dowork2

(person

&p)

整體型別化
template

<

class

t>

void

dowork3

(t &p)

template

<

class

t>

class

person

;//在普通類繼承之前,派生類必須知道基類的大小

//在繼承時顯式宣告

class

child

:public person<

int>

;//當派生類是模板類時,可以模板化

template

<

classt1,

class

t2>

class

child1

:public person

;

template

<

class

t>

class

person

;//類外實現成員函式

template

<

class

t>

person

::person()

template

<

class

t>

void person

::showperson()

盡量不要份檔案編寫,寫到乙個檔案即可, .hpp就是類模板的檔案

//需要讓編譯器提前看到友元函式的宣告,如下

template

<

class

t>

class

person3

;template

<

class

t>

void

printperson

(person3

&p);

template

<

class

t>

class

person

public

:person

(t num)

; t m_a;};

template

<

class

t>

person

::person

(t num)

template

<

class

t>

void

printperson

(person

&p)void

test03()

型別轉換是將一種資料型別轉換成另一種資料型別,轉換是非常有用的,但是也會帶來一些其他的問題,例如越界問題。盡量少的去做型別轉換

//基本資料型別轉換

void

test01()

//父類和子類指標的轉換

class

base

;class

child

:public base

;class

other

;void

test02()

//父類和子類引用的轉換

void

test03()

有條件轉換,動態型別轉換,執行時型別安全檢查**換失敗返回null)

class

base};

class

child

:public base};

void

test01()

class

base};

class

child

:public base};

void

test01()

最不安全的轉換機制,僅僅重新解釋型別,但沒有進行二進位制的轉換:

轉換的型別必須是乙個指標、引用、算術型別、函式指標或者成員指標。

在位元位級別上進行轉換。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。但不能將非32bit的例項轉成指標。

最普通的用途就是在函式指標型別之間進行轉換。

很難保證移植性

c 複習之泛型程式設計入門

目前感覺對泛型程式設計理解的不夠深,現主要對泛型簡單的應用做個總結。泛型程式設計主要包括 函式模板和類模板 1 函式模板 1.1函式模板定義及使用 template template 作為模板關鍵字,從原理上注意編譯器並不是把函式模板處理成任意型別的函式 而是編譯器把函式模板通過具體的型別產生不同的...

C 複習之泛型

1.什麼是泛型?首先看下面的例子 class myintclass public int pop 上面的例子宣告了乙個myintclass類,它實現了乙個int型別的棧,它允許將int壓入棧,也可彈出。如果我們現在需要乙個float的型別實現相同的功能,那麼我們需要將以上 複製貼上,將類名改變並且需...

C 泛型型別 泛型方法

泛型會宣告型別引數 泛型的消費者需要提供型別引數來把佔位符型別填充 public class stack var stack newstack int stack.push 2 stack.push 3 int x stack.pop 2int y stack.pop 3stack open typ...