欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++深入了解模板的使用

 更新時間:2022年06月23日 11:39:56   作者:beyond.myself  
這篇文章主要介紹了C++中模板(Template)的詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一.泛型編程

泛型編程:不再是針對某種類型,能適應廣泛的類型,跟具體的類型無關的代碼

如何實現一個通用的交換函數呢?

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}
void Swap(double& left, double& right)
{
	double temp = left;
	left = right;
	right = temp;
}

使用函數重載雖然可以實現,但是有一下幾個不好的地方: 1. 重載的函數僅僅是類型不同,代碼復用率比較低,只要有新類型出現時,就需要用戶自己增 加對應的函數 2. 代碼的可維護性比較低,一個出錯可能所有的重載均出錯

因此我們需要告訴編譯器一個模子,讓編譯器根據不同的類型利用該模子來生成代碼

二.函數模板

模板分為:函數模板,類模板

1.函數模板概念

函數模板代表了一個函數家族,該函數模板與類型無關,在使用時被參數化,根據實參類型產生 函數的特定類型版本。

2.函數模板格式

template<typename T>

返回值類型 函數名(參數列表){}

說明:

1.template<class T> 和 template<typename T>在此暫時認為一樣,template<struct T>是 錯誤的 ,沒有這種寫法

2.T是type的縮寫,T不一定寫T,可以寫任意字母,比如X,t ……但是習慣寫為T

舉例:

template<typename T>    //或template<class T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tmp;
}
int main()
{
	int a = 0, b = 1;
	double c = 2.2, d = 3.3;
	swap(a, b);
	swap(c, d);
	return 0;
}

swap(a, b);swap(c, d); 調用的是同一個函數嗎?

答:不是同一個。底層匯編可以看出不是同一個,如果調試時發(fā)現走的是同一個函數,其實是編譯器的優(yōu)化導致。

實際上以后swap函數都不用自己寫了,庫中有模板,直接用就行

3.函數模板的原理

在編譯器編譯階段 ,對于模板函數的使用, 編譯器需要根據傳入的實參類型來推演生成對應類型 的函數 以供調用。比如: 當用 double 類型使用函數模板時,編譯器通過對實參類型的推演,將 T 確定為 double 類型,然后產生一份專門處理 double 類型的代碼 ,對于字符類型也是如此。 模板的實例化:

三.類模板

類模板的定義格式

template < class T1 , class T2 , ..., class Tn >

class 類模板名

{

// 類內成員定義

};

舉例:調用 Stack<int> st1; 時,用int替換模板中的T。調用 Stack<double> st1; 時,用double替換模板中的T

// 類模板
template<class T>
class Stack
{
public:
	Stack(int capacity = 0)
	{
		_a = new T[capacity];
		_capacity = capacity;
		_top = 0;
	}
	~Stack()
	{
		cout << "~Stack()" << endl;
		delete[] _a;
		_capacity = 0;
		_top = 0;
	}
	void Push(const T& x)
	{}
private:
	T* _a;
	int _top;
	int _capacity;
};
int main()
{
	Stack<int> st1; // int
	st1.Push(1);
	Stack<double> st2; // double
	st2.Push(2.2);
	return 0;
}

到此這篇關于C++深入了解模板的使用的文章就介紹到這了,更多相關C++模板內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言詳解實現猜數字游戲步驟

    C語言詳解實現猜數字游戲步驟

    猜數字是興起于英國的益智類小游戲,起源于20世紀中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數字,一方猜,今天我們來實現這個游戲案例
    2022-07-07
  • Qt編寫地圖遷徙圖的實現示例

    Qt編寫地圖遷徙圖的實現示例

    本文主要介紹了Qt編寫地圖遷徙圖的實現示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言代碼實現簡單的掃雷小游戲

    C語言代碼實現簡單的掃雷小游戲

    這篇文章主要為大家詳細介紹了C語言代碼實現簡單的掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C語言數據結構單鏈表接口函數全面講解教程

    C語言數據結構單鏈表接口函數全面講解教程

    這篇文章主要為大家介紹了C語言數據結構單鏈表所有接口函數的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-10-10
  • C++回溯算法中組合的相關問題分析

    C++回溯算法中組合的相關問題分析

    回溯算法并不是什么高效的算法,因為本質上時去遍歷所有元素,找出所有可能,然后選出需要的答案。那為什么還要回溯法,簡單來說,不是所有的問題都能用什么巧妙的方法來解決的
    2023-03-03
  • C++11/14 線程中使用Lambda函數的方法

    C++11/14 線程中使用Lambda函數的方法

    這篇文章主要介紹了C++11/14 線程中使用Lambda函數的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • C++使用boost::lexical_cast進行數值轉換

    C++使用boost::lexical_cast進行數值轉換

    這篇文章介紹了C++使用boost::lexical_cast進行數值轉換的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Easyx實現掃雷游戲

    Easyx實現掃雷游戲

    這篇文章主要為大家詳細介紹了Easyx實現掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++11中std::thread線程實現暫停(掛起)功能

    C++11中std::thread線程實現暫停(掛起)功能

    本文主要介紹了C++11中std::thread線程實現暫停(掛起)功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 基于一個簡單定長內存池的實現方法詳解

    基于一個簡單定長內存池的實現方法詳解

    本篇文章對一個簡單定長內存池的實現方法進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05

最新評論