模板的機制
函式的侷限性
類模板類模板的繼承問題
類外實現模板類的成員函式
類模板的分檔案編寫
類模板和友元函式
c++型別轉換
泛型程式設計是從乙個抽象層面描述一種型別的演算法,不管容器型別是什麼,是一種不同於oop的角度來抽象具體演算法c++用模板來實現泛型程式設計,模板分為函式模板和類模板
在使用函式模板時,一定要讓編譯器知道t是什麼型別,否則無法使用template
<
class
/typename t>
//告訴編譯器遇到t不要報錯
myswap
(t &a, t &b)
//型別引數化,在使用時會進行自動型別推導,將a和b的型別傳給t
myswap<
int>
(a, b)
//顯式指定型別
型別轉換
普通函式可以進行隱式型別轉換(顯示表示)
函式模板不可以
呼叫順序
當普通函式對函式模板進行了函式過載時,優先呼叫普通函式,如果普通函式出錯,則出錯,不會再去呼叫函式模板
如果需要強制呼叫函式模板,可以加 <> 來呼叫
函式模板也可以進行函式過載
如果函式模板可以產生更好的匹配,優先呼叫函式模板
模板不能解決所有的型別,可以使用第三代具體化來實現
//函式模板
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
;
盡量不要份檔案編寫,寫到乙個檔案即可, .hpp就是類模板的檔案template
<
class
t>
class
person
;//類外實現成員函式
template
<
class
t>
person
::person()
template
<
class
t>
void person
::showperson()
//需要讓編譯器提前看到友元函式的宣告,如下
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()
型別轉換是將一種資料型別轉換成另一種資料型別,轉換是非常有用的,但是也會帶來一些其他的問題,例如越界問題。盡量少的去做型別轉換
有條件轉換,動態型別轉換,執行時型別安全檢查**換失敗返回null)//基本資料型別轉換
void
test01()
//父類和子類指標的轉換
class
base
;class
child
:public base
;class
other
;void
test02()
//父類和子類引用的轉換
void
test03()
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...