模板類是乙個很有用的工具, 平常使用比較多的像std::vector, std::map, std::queue都是模板類, 可以說很方便. 但是背後的實現可以說是很複雜, 包括記憶體分配,包括快速訪問. 我們之所以能這麼方便的使用,全是站在了巨人的肩膀上.模板定義的c++實體如下
本文主要介紹類模板和函式模板, 首先我們定義乙個模板類
template
<
class
t>
class
myclass
;explicit
myclass
(const t& src)
:vec_
(src)
~myclass()
const t&
get_vec()
const
myclass
&operator+(
const myclass r)
; myclass
&operator=(
const myclass r)
;public
: t vec_;
};
在這個類當中,我們定義了乙個公有成員變數,這個變數可以被外部訪問, 這個類可以作為乙個基礎類使用, 另外我們定義了兩個建構函式和乙個析構函式. 另外的函式包括返回成員的函式和兩個操作符過載的函式;
接下來是關於類模板的實現了, 可以看到,這裡面有一些內聯函式,由於比較短, 寫成內聯的比較合適. 關於過載操作符的兩個函式則在類外定義. 注意:根據c++標準類模板的定義與實現都得在同乙個.hpp檔案裡
template
<
class
t>
inline
myclass
& myclass
::operator=(
const myclass r)
template
<
class
t>
inline
myclass
& myclass
::operator+(
const myclass r)
模板類的用途大多數的時候是用在公用庫裡面, 供他人呼叫
.這個類在邏輯上顯得比較多餘,但是可以拿來練手. 如果考慮將其實現為vector這樣的類,那麼得考慮動態記憶體分配, 考慮記憶體釋放的問題,比較複雜.
另外多看優秀的原始碼可以幫我們提高**能力, 如下面這段,我擷取了opencv裡面的rect_類的實現
,即矩形的實現
rect.hpp
template
<
typename _tp>
class
rect_
;template
<
typename _tp>
inline
rect_<_tp>
::rect_()
:x(0
),y(
0),width(0
),height(0
)template
<
typename _tp>
inline
rect_<_tp>
::rect_
(_tp _x, _tp _y, _tp _width, _tp _height):x
(_x),y
(_y)
,width
(_width)
,height
(_height)
template
<
typename _tp>
inline
rect_<_tp>
::rect_
(const rect_& r):x
(r.x),y
(r.y)
,width
(r.width)
,height
(r.height)
template
<
typename _tp>
inline
rect_<_tp>
::rect_
(rect_&& r):x
(std::
move
(r.x)),
y(std::
move
(r.y)),
width
(std::
move
(r.width)),
height
(std::
move
(r.height)
)template
<
typename _tp>
inline
rect_<_tp>
& rect_<_tp>
::operator=(
const rect_<_tp>
& r)
template
<
typename _tp>
inline
rect_<_tp>
& rect_<_tp>
::operator
=( rect_<_tp>
&& r)
template
<
typename _tp>
inline
rect_<_tp>
& rect_<_tp>
::operator+(
const rect_<_tp>
& r)
template
<
typename _tp>
inline
_tp rect_<_tp>
::area()
const
template
<
typename _tp>
inline
bool rect_<_tp>
::empty()
const
注意:不要在.hpp檔案中使用using namespace std這樣的**,很容易造成命名空間汙染
rect_類的實現,作為opencv的乙個基礎型別,使用場合還是很多的,可以看到他的建構函式比較豐富,而且我還刪除了其中的一些和point_類的相關的建構函式, 和成員函式. 另外我加了乙個+號的操作符過載函式, 邏輯上來講, 兩個矩形相加的操作沒太大意義
最後放上main函式
#include
#include
#include
"myclass.hpp"
#include
"rect.hpp"
using
namespace std;
intmain
(int argc,
char
* ar**)
通過多看原始碼,可以學習別人的優秀技巧!
2020.01.17 --zlatan
C 模板類總結
一 模板簡介 在c 中,模板讓程式設計師能夠定義一種適用於不同型別的物件行為。這聽起來有點像巨集,但巨集不是型別安全的,而模板是型別安全的。二 模板宣告語法 關鍵字template標誌著模板類宣告的開始,接下來是模板引數列表。該引數列表包含關鍵字typename,它定義了模板引數objecttype...
類模板的使用 類模板使用總結
歸納以上的介紹,可以這樣宣告和使用類模板 先寫出乙個實際的類。將此類中準備改變的型別名 如int要改變為float或char 改用乙個自己指定的虛擬型別名 如上例中的t 在類宣告前面加入一行,格式為 templatetemplate class a 類體用類模板定義物件時用以下形式 類模板名 實際型...
c 類模板(模板類)
人們需要編寫多個形式和功能都相似的函式,因此有了函式模板來減少重複勞動 人們也需要編寫多個形式和功能都相似的類,於是 c 引人了類模板的概念,編譯器從類模板可以自動生成多個類,避免了程式設計師的重複勞動。有了類模板的機制,只需要寫乙個可變長的陣列類模板,編譯器就會由該類模板自動生成整型 double...