c++模板的初步認知-創(chuàng)新互聯(lián)

目錄

十多年的蔚縣網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整蔚縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“蔚縣網(wǎng)站設計”,“蔚縣網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

一、需求引入:

缺點顯而易見:

二、模板

三、函數(shù)模板

1、class與struct區(qū)別

2、例一:add函數(shù)

3、 例一的優(yōu)化:一般都使用const萬能引用

4、const引用回顧

四、函數(shù)模板參數(shù)實例化

1、add函數(shù)的調(diào)試編譯

2、更多參數(shù)的引入

一、使用強轉(zhuǎn)使,int改為一個double類型

二、多使用一個模板參數(shù)(隱式實例化)

三、使用顯示實例化 (會進行隱式類型轉(zhuǎn)換)

3、小結(jié):

五、模板參數(shù)的使用規(guī)則

六、函數(shù)模板 編譯原理

實例:復數(shù)的運算(匿名函數(shù)的返回)

①例一:

②加入了運算符重載(返回值推薦使用匿名對象)

七、類模板


一、需求引入:

我們?nèi)绾螌崿F(xiàn)一個滿足不同種類型的通用交換函數(shù)?

寫上不同種類型的重載函數(shù)?顯然所需要的精力和需求滿足不適宜。如下還需要其他多種類型的重載函數(shù)的書寫

缺點顯而易見:

①重載的函數(shù)僅僅是類型不同,代碼復用率比較低

②代碼的可維護性比較低

void swap(int left, int right)
{
	int temp = right;
	right = left;
	left = temp;
}void swap(double left, double right)
{
	double temp = right;
	right = left;
	left = temp;
}void swap(char left, char right)
{
	char temp = right;
	right = left;
	left = temp;
}
二、模板

如果可以使用一個模具,我只需要填充我所需要放入的不同材料(類型)來達到我刻印出來不同類型的方法。

如下我只需要填入不同的類型,就可以得到我所需要的對應方法。

c++中的模板分為函數(shù)模板與類模板

三、函數(shù)模板

來看下面這段代碼:

templatevoid swap(T& left, T& right)
{
	T temp = right;
	right = left;
	left = temp;
}
templatevoid swap(T& left, T& right)
{
	T temp = right;
	right = left;
	left = temp;
}

templatevoid Print(T date1, S date2, U date3)
{
	cout<< date1<< endl;
	cout<< date2<< endl;
	cout<< date3<< endl;
}

template函數(shù)模板的引入使其能夠根據(jù)傳入?yún)?shù)的類型來自己判斷T的類型。

此處的typename可以替換為class,那么我們又學到了class與struct的第二個區(qū)別了

1、class與struct區(qū)別

①是在類中定義時的默認訪問權(quán)限不同(struct為public,class為private)

②模板參數(shù)列表只能用class聲明,不能使用struct/

2、例一:add函數(shù)

3、 例一的優(yōu)化:一般都使用const萬能引用

(const引用是萬能引用)

我們知道如果傳入的參數(shù)是一個自定義類型的參數(shù),那么我們就需要對參數(shù)進行拷貝構(gòu)造,這顯然降低了我們代碼的效率,所以我們可以選擇傳引用,來解決這個問題。

可是這一優(yōu)化,卻帶來了編譯報錯的問題,這時候這里的引用需要更改為const類型的引用

4、const引用回顧

上篇中為啥使用了const就解決了問題呢?

我們先來回顧一個const引用:看一下這個代碼:

下面這個代碼中用ar引用 a沒問題,可是用br引用一個const修飾的變量b時,出現(xiàn)了問題,

因為在c++中由const修飾的變量就成為了一個常量了,(c語言中const修飾后是一個不能更改的變量)

一個常量使用一個可能被修改的別名br來引用,因此違背了我b是一個常量的原則。

所以引發(fā)錯誤。

那我們上面的add函數(shù)在傳參時傳遞了倆個常量參數(shù)(10,20),然而引用上卻使用了一個可能被修改的參數(shù)就會發(fā)生錯誤,因此這里的引用參數(shù)需要被const限定符修飾。

四、函數(shù)模板參數(shù)實例化

函數(shù)模板:該函數(shù)模板與類型無關,在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生函數(shù)的待定類型版本

函數(shù)模板不是函數(shù),是一個模具、是一個規(guī)則

是編譯器根據(jù)實例化結(jié)果推演出的類型生成處理具體類型代碼的一個規(guī)則

1、add函數(shù)的調(diào)試編譯

使用typid(T).name()來查看所轉(zhuǎn)化的參數(shù)類型結(jié)果。

2、更多參數(shù)的引入

看下面這個代碼出現(xiàn)的問題,想到傳入一個int類型與一個double類型的參數(shù),發(fā)現(xiàn)卻無法實現(xiàn),因為編譯器為了安全性不會去猜這個所傳入的參數(shù)到底是int還是double。

解決:

一、使用強轉(zhuǎn)使,int改為一個double類型

二、多使用一個模板參數(shù)(隱式實例化)

隱式實例化:沒有明確指出模板參數(shù)的類型,需要編譯器對實參類型進行推演

???? 編譯器不會進行隱式類型轉(zhuǎn)換

進行函數(shù)模板實例化

可以根據(jù)調(diào)用參數(shù)的類別進行自己識別,10-int,20-int編譯器會推演出int類型的add函數(shù)

????????????????????????????????? 1.2-double,3.4-double編譯器會推演出double類型的add函數(shù)

?????????????????????????????????? ‘a(chǎn)’ -char ‘b’-char編譯器會推演出char類型的add函數(shù)

另外可以寫入多個模板參數(shù)。

三、使用顯示實例化 (會進行隱式類型轉(zhuǎn)換)

3、小結(jié):

五、模板參數(shù)的使用規(guī)則

①同名的模板函數(shù)可以和一個非模板函數(shù)同時存在

templateT Add(const T& left,const T& right)
{
	return left + right;
}
int Add(int left, int right)
{
	return left + right;
}
int main()
{
    // 直接調(diào)用普通函數(shù)
	Add(1, 2);		// 如果有類型完全匹配的方法則直接調(diào)用,不需要讓編譯器根據(jù)模板生成
	
    // 以下倆種方法調(diào)用模板函數(shù)
    Add(1, 2);	// 顯示實例化
	Add<>(1, 2);	// 隱式實例化 告訴編譯器根據(jù)模板來生成對應類型的int
	return 0;
}

② 對于非模板函數(shù)和模板函數(shù),在調(diào)用時會優(yōu)先調(diào)用非模板函數(shù)而不會從模板函數(shù)中實例化。

如果模板可以產(chǎn)生一個更好的具有更好匹配的函數(shù),那么將選擇模板

③模板函數(shù)不允許自動類型轉(zhuǎn)換,但普通函數(shù)可以進行自動類型轉(zhuǎn)換

六、函數(shù)模板 編譯原理

在參數(shù)實例化之前,只是對模板進行簡單的語法檢測

在參數(shù)實例化之后,根據(jù)用戶對函數(shù)模板的實例化結(jié)果來生成處理對類型的代碼,并對這些代碼進行再次編譯。

實例:復數(shù)的運算(匿名函數(shù)的返回)

看下部分這段代碼,采用了上部分模板函數(shù)的使用,可是無法指明所需要對應的加的對象,需要進行更新

①例一:

②加入了運算符重載(返回值推薦使用匿名對象)

一二倆步都可以達到目標,一使用的是構(gòu)造一個臨時對象來保存加和之后的值,不僅需要進行一次構(gòu)造函數(shù),還會進行一步ret結(jié)果的拷貝構(gòu)造,而二使用的是匿名對象的返回,可以直接返回加和之后的結(jié)果,少了一次拷貝構(gòu)造。因此能使用匿名對象返回的盡量使用匿名對象返回,因為這樣會少調(diào)用一次拷貝構(gòu)造,效率得到了提高。

七、類模板

類模板實例化與函數(shù)模板實例化不同,類模板實例化需要在類模板名字后跟<>,然后將實例化的類型放在<>中即可,類模板名字不是真正的類,而實例化的結(jié)果才是真正的類

編譯器會根據(jù)所需要定義和插入的數(shù)據(jù)類型來進行自我推演,推演出合適的對象類型。

#includeusing namespace std;

templateclass SeqList
{
public:
	SeqList(size_t cap = 10)
		: _array(nullptr)
		, _capacity(cap == 0 ? 3 : cap)
		, _size(0)
	{
		_array = new T[10];
	}

	void Push(const T& date)
	{
		_array[_size] = date;
		_size++;
	}

	void Pop()
	{
		if (Empty())
			return;
		else
			_size--;
	}

	bool Empty()
	{
		return 0 == _size;
	}

	~SeqList()
	{
		if (_array)
		{
			delete[] _array;
			_array = nullptr;
			_capacity = 0;
			_size = 0;
		}
	}

	// 類內(nèi)聲明 類外定義
	T& Front();
	T& Back();

private:
	T* _array;
	size_t _capacity;
	size_t _size;
};

templateT& SeqList::Front()
{
	return _array[0];
}

// 此處的SeqList為類模板
// SeqList才是類型
templateT& SeqList::Back()
{
	return _array[_size - 1];
}

int main()
{
	// SeqList不是一個類,而是一個類模板
	// SeqLits才是真正的類型
	SeqLists1;	
	s1.Push(1);
	s1.Push(2);
	s1.Push(3);
	s1.Push(4);

	SeqLists1;
	s1.Push(1.1);
	s1.Push(2.2);
	s1.Push(3.3);
	s1.Push(4.4);
	return 0;
}
八、知識點辨析

1、類模板與模板類

可以看后置的賓語來判斷 類模板為一個模板

??????????????????????????? ? 模板類為一個類 是一個實例 也就是模板實例化后的一個產(chǎn)物

2、類模板的成員函數(shù)均為模板函數(shù)(√)

起初我以為模板函數(shù)只有存在template的才為模板函數(shù),顯然是錯誤的,因為一個類模板能夠成為模板,他的類內(nèi)成員函數(shù)也均能夠被實例化。

3、

4、D. 模板類跟普通類以一樣的,編譯器對它的處理時一樣的(×)

模板函數(shù)的處理分為倆個階段:

①實例化之前,只是對模板進行簡單的語法檢測

②實例化之后,根據(jù)用戶對函數(shù)模板的實例化結(jié)果來生成處理對應類型的代碼,并對這些代碼進行再次編譯。

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

當前文章:c++模板的初步認知-創(chuàng)新互聯(lián)
URL鏈接:http://muchs.cn/article32/dspdsc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站、企業(yè)網(wǎng)站制作網(wǎng)頁設計公司、手機網(wǎng)站建設、網(wǎng)站改版、網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計