最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++圖文并茂分析講解模板

 更新時(shí)間:2022年09月15日 15:38:46   作者:龜龜不斷向前  
C++語言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下

1.內(nèi)容引入

? 不知道大家是否在高中時(shí)背過英語范文模板,以下就是博主的回憶:

? 這篇模板是一些英語比較好的老師寫的。

? 每當(dāng)碰到感謝信時(shí),我都會(huì)狂喜,盡管感謝的內(nèi)容不同,地點(diǎn)不同,我都可以去根據(jù)模板,再根據(jù)作文分析模板的那些空對(duì)應(yīng)應(yīng)該填入什么。

其實(shí)呢c++中也用模板,但是這個(gè)時(shí)候,我們是寫模板的人,而編譯器變成了那個(gè)根據(jù)模板照葫蘆畫瓢的人

2.模板函數(shù)

C語言寫交換函數(shù)

#include<iostream>
using namespace std;
void Swapi(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void Swapd(double* a, double* b)
{
	double tmp = *a;
	*a = *b;
	*b = tmp;
}
//……
int main()
{
	int a = 1, b = 2;
	Swapi(&a, &b);
	double c = 1.1, d = 2.2;
	Swapd(&c, &d);
	return 0;
}

? 要實(shí)現(xiàn)不同類型的交換,實(shí)參不僅要傳地址,而且不同類型的函數(shù)的名字要保持不同

至于為什么會(huì)這樣,大家可以去看看我的文章。解釋了為什么c語言不支持函數(shù)重載:

傳送門

C++寫交換函數(shù)

#include<iostream>
using namespace std;
void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}
//……
int main()
{
	int a = 1, b = 2;
	Swap(a, b);
	double c = 1.1, d = 2.2;
	Swap(c, d);
	return 0;
}

? C++在語法上增加了引用和函數(shù)重載,在一定程度上彌補(bǔ)了c語言的不足,但是上述代碼明明邏輯很相似,卻還是要我們?nèi)?shí)現(xiàn)不同類型的代碼,對(duì)于我們這種懶人來說,簡(jiǎn)直就是煎熬

? 但是計(jì)算機(jī)他是一個(gè)任勞任怨的好鐵,不來不會(huì)感到疲勞,厭倦,是一個(gè)頭腦優(yōu)點(diǎn)笨笨的但是計(jì)算能力超強(qiáng)的大鐵塊。

模板交換函數(shù)的語法及其原理

語法

#include<iostream>
using namespace std;
template <class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 1, b = 2;
	Swap(a, b);
	double c = 1.1, d = 2.2;
	Swap(c, d);
	return 0;
}

? 這樣寫交換函數(shù)是不是就輕松多了,但是我們思考以下,上述代碼調(diào)用的是一個(gè)Swap函數(shù)還是兩個(gè)Swap函數(shù)呢?

回顧我們說的模板,是我們寫的模板,然后編譯器照著模板幫我們寫出了intdouble類型的交換函數(shù)。

原理

圖解:

我們也可以通過調(diào)試上述代碼,轉(zhuǎn)到反匯編,看看調(diào)用的函數(shù)是否真的是不同的函數(shù)。

理解顯示實(shí)例化和隱式實(shí)例化

我們那模板加法函數(shù)來理解

#include<iostream>
using namespace std;
T Add(const T& x,const T& y)
{
	return x + y;
}
int main()
{
	int a = 1, b = 2;
	double c = 1.1, d = 2.2;
	cout << Add(a, b) << endl;//編譯器要自己推類型的是隱式實(shí)例化
	cout << Add(c, d) << endl;
	//cout << Add(a, c) << endl;//error這樣的寫法就錯(cuò)了,為難編譯器了,編譯器也推不出來了
	cout << Add<int>(a, c) << endl;//不需要編譯器去推的是顯示實(shí)例化
	cout << Add<double>(b, d) << endl;
	cout << Add(a, (int)c) << endl;
	return 0;
}

編譯器要自己去推T是什么類型的,就是隱式實(shí)例化

而由我們告訴編譯器T是什么類型的,就是顯示實(shí)例化

關(guān)于編譯器也是懶人這件事

我們來看幾道模板函數(shù)的代碼來看看編譯器是如何做事的:

#include<iostream>
using namespace std;
int Add(int left, int right)
{
	return left + right;
}
// 通用加法函數(shù)
template<class T>
T Add(T left, T right)
{
	return left + right;
}
int main()
{
	Add(1, 2);       // 與非模板函數(shù)匹配,編譯器不需要特化
	Add<int>(1, 2);  // 調(diào)用編譯器特化的Add版本
	return 0;
}

? 如果調(diào)試了上述代碼就會(huì)發(fā)現(xiàn),編譯器第一次調(diào)用的是第一個(gè)Add函數(shù),第二次由于我們的指定,編譯器調(diào)用的是模板加法函數(shù)。

#include<iostream>
using namespace std;
int Add(int left, int right)
{
	return left + right;
}
template < class T1, class T2>
T1 Add(const T1 x,const T2 y)
{
	return x + y;
}
int main()
{
	Add(1, 2);
	Add(1, 2.0);//如果不寫模板,會(huì)進(jìn)行一個(gè)類型轉(zhuǎn)換,再去調(diào)用第一個(gè)
	return 0;
}

3.類模板

由于c++的順序表是用vector表示的,下面咱們的類名也用vector表示

像以前我們實(shí)現(xiàn)一個(gè)順序表是這樣的。

typedef int VDateType;
class vector
{
public:
	//……
private:
	VDateType* _a;
	size_t _size;
	size_t _capacity;
};
int main()
{
	vector v1;
	vector v2;
	return 0;
}

但是我們無法讓v1是int類型的順序表,v2是double類型的順序表。

用模板類來實(shí)現(xiàn)

#include<iostream>
#include<assert.h>
using namespace std;
namespace kcc
{
	template<class T>
	class vector
	{
	public:
		vector()
			:_a(nullptr)
			, _size(0)
			, _capacity(0)
		{}
		// 拷貝構(gòu)造和operator= 這里涉及深淺拷貝問題,還挺復(fù)雜,后面具體再講
		~vector()
		{
			delete[] _a;
			_a = nullptr;
			_size = _capacity = 0;
		}
		void push_back(const T& x)
		{
			if (_size == _capacity)
			{
				int newcapacity = _capacity == 0 ? 4 : _capacity * 2;
				T* tmp = new T[newcapacity];
				if (_a)
				{
					memcpy(tmp, _a, sizeof(T) * _size);
					delete[] _a;
				}
				_a = tmp;
				_capacity = newcapacity;
			}
			_a[_size] = x;
			++_size;
		}
		// 讀+寫
		T& operator[](size_t pos);
		size_t size();
	private:
		T* _a;
		size_t _size;
		size_t _capacity;
	};
	// 模板不支持分離編譯,也就是聲明在.h ,定義在.cpp,原因后面再講
	// 建議就是定義在一個(gè)文件 xxx.h  xxx.hpp
	// 在類外面定義
	template<class T>
	T& vector<T>::operator[](size_t pos)
	{
		assert(pos < _size);
		return _a[pos];
	}
	template<class T>
	size_t vector<T>::size()
	{
		return _size;
	}
}
int main()
{
	kcc::vector<int> v1;		// int
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	// v1.operator[](3);
	//cout << v1[3] << endl;
	//cout << v1[5] << endl;
	for (size_t i = 0; i < v1.size(); ++i)
	{
		v1[i] *= 2;
	}
	cout << endl;
	for (size_t i = 0; i < v1.size(); ++i)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	kcc::vector<double> v2;   // double
	v2.push_back(1.1);
	v2.push_back(2.2);
	v2.push_back(3.3);
	v2.push_back(4.4);
	for (size_t i = 0; i < v2.size(); ++i)
	{
		cout << v2[i] << " ";
	}
	cout << endl;
	return 0;
}

如果內(nèi)部成員函數(shù)在類的外面定義的話,要加上類名::

當(dāng)然了,本文章并不是重點(diǎn)介紹順序表vector的實(shí)現(xiàn),而是讓大家看看類模板的效果

vector會(huì)在后續(xù)的文章中更新,敬請(qǐng)期待!

到此這篇關(guān)于C++圖文并茂分析講解模板的文章就介紹到這了,更多相關(guān)C++模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ Boost PropertyTree解析INI文件詳解

    C++ Boost PropertyTree解析INI文件詳解

    Boost PropertyTree庫不僅可以解析JSON,XML格式,還可以直接解析INI格式文件。這篇文章就是為大家介紹一下如何通過Boost PropertyTree解析INI文件,需要的可以參考一下
    2022-01-01
  • C語言多線程開發(fā)中死鎖與讀寫鎖問題詳解

    C語言多線程開發(fā)中死鎖與讀寫鎖問題詳解

    死鎖是指多個(gè)線程因競(jìng)爭(zhēng)資源而造成的僵局(互相等待);有些公共數(shù)據(jù)修改的機(jī)會(huì)很少,但其讀的機(jī)會(huì)很多。并且在讀的過程中會(huì)伴隨著查找,給這種代碼加鎖會(huì)降低我們的程序效率。讀寫鎖可以解決這個(gè)問題;
    2022-05-05
  • 簡(jiǎn)介C++編程中的運(yùn)算符重載

    簡(jiǎn)介C++編程中的運(yùn)算符重載

    這篇文章簡(jiǎn)單介紹了C++編程中的運(yùn)算符重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語言函數(shù)傳遞數(shù)組和傳遞地址的區(qū)別你知道嗎

    C語言函數(shù)傳遞數(shù)組和傳遞地址的區(qū)別你知道嗎

    這篇文章主要介紹了C語言中數(shù)組作為函數(shù)的參數(shù)以及返回值的使用簡(jiǎn)單入門,這里以一維數(shù)組作為基本條件進(jìn)行例子講解,需要的朋友可以參考下
    2021-09-09
  • C語言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例

    C語言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了C語言多功能動(dòng)態(tài)通訊錄實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C++?STL反向迭代器的實(shí)現(xiàn)

    C++?STL反向迭代器的實(shí)現(xiàn)

    本文主要介紹了C++?STL反向迭代器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 帶你了解如何用C++合并兩個(gè)有序鏈表

    帶你了解如何用C++合并兩個(gè)有序鏈表

    這篇文章主要介紹了c++ 如何合并兩個(gè)有序鏈表,小編感覺這篇文章還不錯(cuò),希望能幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2021-08-08
  • 淺談C/C++ 語言中的表達(dá)式求值

    淺談C/C++ 語言中的表達(dá)式求值

    下面小編就為大家?guī)硪黄獪\談C/C++ 語言中的表達(dá)式求值。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • Windows的鉤子機(jī)制詳解

    Windows的鉤子機(jī)制詳解

    這篇文章主要介紹了Windows的鉤子機(jī)制,對(duì)于初學(xué)者進(jìn)一步了解windows程序設(shè)計(jì)中鉤子的原理及運(yùn)用有很大的幫助,需要的朋友可以參考下
    2014-07-07
  • C++11中bind綁定器和function函數(shù)對(duì)象介紹

    C++11中bind綁定器和function函數(shù)對(duì)象介紹

    這篇文章主要介紹了C++11中bind綁定器和function函數(shù)對(duì)象介紹,綁定器,函數(shù)對(duì)象和lambda表達(dá)式只能使用在一條語句中,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07

最新評(píng)論

婺源县| 喀喇沁旗| 蒲城县| 集贤县| 宁国市| 美姑县| 金阳县| 龙泉市| 永平县| 本溪市| 郧西县| 丁青县| 迁安市| 嘉荫县| 墨脱县| 通化市| 隆回县| 巴塘县| 沙坪坝区| 鞍山市| 保德县| 察哈| 井冈山市| 增城市| 五家渠市| 昌都县| 马鞍山市| 香港| 安徽省| 江门市| 科技| 太仆寺旗| 宁远县| 渭源县| 镇赉县| 宣恩县| 大田县| 柞水县| 赫章县| 福贡县| 四川省|