前言
本系列文章承接C語言的學習,需要有C語言的基礎才能學會哦~
第8篇主要講的是有關于C++的模板初階。
C++才起步,都很簡單!!
目錄
前言
模板初階
基本語法
函數模板的實例化
顯式實例化的作用
類模板
基本語法
模板初階
模板,也就是函數模板,調用實例化后才會成為函數。
基本語法
沒使用模板前,我們為了適配不同的數據類型,需要寫三個甚至更多的Swap函數,但他們的邏輯是類似的,甚至完全一樣。
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;
}
void Swap(char& left, char& right)
{char temp = left;left = right;right = temp;
}
代碼1↑
使用模板后
//模板
template<typename T>
void Swap(T& left, T&right)
{T temp = left;left = right;right = temp;
}int main()
{int x = 0, y = 1;double m = 1.1, n = 2.2;//調用Swap(x, y);Swap(m, n);return 0;
}
代碼2↑
①typename是關鍵字。也可以用class,兩者有些許區別,后面再講。
②T為模板參數,可以有多個模板參數,逗號分隔,模板參數在實例化時可替換為數據類型,同一個模板參數只能替換為同一個數據類型。
③調用時,編譯器會根據傳入參數推演,把T替換為對應的數據類型,由編譯器幫助生成實例化函數。Swap(x,y)會實例化為代碼1中的第一段Swap,Swap(m,n)會實例化為第二段Swap,調用的是不同的函數。
函數模板的實例化
分為隱式實例化和顯式實例化。
?//模板
template<typename T>
void Swap(T& left, T&right)
{T temp = left;left = right;right = temp;
}//隱式實例化
Swap(x, y);
Swap(m, n);
//或者自行強制類型轉化
Swap(x, (int)n);
Swap((double)x, n);//顯式實例化
Swap<int>(x, m);
Swap<double>(x, m);
隱式實例化:編譯器根據實參推演模板參數的實際類型。
顯式實例化:用尖括號<>指明模板參數的替換。
顯式實例化的作用
T func(size_t n)
{return T;
}
如上函數,代碼無法通過函數參數推演出模板參數要替換成的實際類型,因此需要顯式實例化指明類型。
func<int>(2);
tips1:如果運行代碼Add(2, 3),程序會調用哪段代碼?
int Add(int a, int b)
{return a + b;
}template<class T>
T Add(T a, T b)
{return a + b;
}
會調用第一段代碼,有現成的用現成的,減少推演的步驟,提高效率。
如果非要調用模板,那就運行代碼Add<int>(2, 3),用顯式實例化讓程序使用模板。
tips2:如果運行Add(1.1, 2),就運行第三段模板代碼;如果運行Add(1.1, 2.2),就運行第二段模板代碼
?
int Add(int a, int b)
{return a + b;
}template<class T>
T Add(T a, T b)
{return a + b;
}?template<class T1, class T2>
T1 Add(T1 a, T2 b)
{return a + b;
}
哪個方便用哪個。
類模板
與函數模板用法十分類似。
基本語法
template<typename T>
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data);private:T* _array;size_t _capacity;size_t _size;
};template<class T>
void Stack<T>::Push(const T& data)
{_array[_size++] = data;//········
}
同上:
①是模板,不是實體,需要實例化。
②分為隱式實例化和顯式實例化。
③同一模板參數替換的數據類型不同的時候,實例化出來的對象不屬于同一類。
④哪個模板方便推演用哪個,有現成的就用現成的。
tips:
類模板的聲明與定義分離需要注意——定義的時候要帶上模板參數。
函數參數和模板參數十分類似,前者傳遞的是對象,后者傳遞的是數據類型。而且都可以用缺省參數。
?~~本文完結!!感謝觀看!!接下來更精彩!!歡迎來我博客做客~~?