C 類模板的總結

2021-10-02 06:18:12 字數 3591 閱讀 4778

模板類是乙個很有用的工具, 平常使用比較多的像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...