C++之函式模板與類别範本的區別(三)
函式模板與類别範本有什麼區別?答:函式模板的例項化是由編譯程式在處理函式呼叫時自動完成的,而類别範本的例項化 必須由程式設計師在程式中顯式地指定。
即函式模板允許隱式呼叫和顯式呼叫而類别範本只能顯示呼叫這期間有涉及到函式模板與模板函式,類别範本與模板類的概念(類似於類與類物件的區別)請看下面例子
注意:模板類的函式宣告和實現必須都在標頭檔案中完成,不能像普通類那樣宣告在.h檔案中實現在.cpp檔案中,原因可以看連結http://hi.baidu.com/cn_rigel/blog/item/6cf6fc083723e2286a60fb53.html
#include
"stdafx.h"
//函式模板的例項化在程式呼叫時自動完成
#include
<iostream>
using namespace
std;
//使用模板建立一個返回最大值的函式
//這是一個函式模板
template <class Type>
Type MaxValue(Type a,Type b)
{
if ( a
> b)
{
return a;
}
else
return b;
}
//建立一個堆疊模板類
//這是一個類别範本
template <class T>
class Stack
{
public:
Stack(){ m_nPos
= 0;}
~Stack(){}
void Push(T value);
T Pop();
bool IsEmpty()
{
return m_nPos
== 0;
}
bool HasElement()
{
return !IsEmpty();
}
bool IsFull()
{
return m_nPos
== STATCK_SIZE;
}
private:
int m_nPos;
//使用常量表示堆疊的大小
const static
int STATCK_SIZE = 100;
T m_Data[STATCK_SIZE];
};
//模板類的成員函式實現
template <class T>
void Stack<T>
::Push(T value)
{
//使用後置遞增操作符
m_Data[m_nPos++]
= value;
}
template <class T>
T Stack<T>::Pop()
{
//使用前置遞減操作符
return m_Data[--m_nPos];
}
void TestMaxValue()
{
//隱式呼叫
cout
<<
MaxValue(
100, 204)<<
endl;//MaxValue(
100, 204)這是一個模板函式
cout << MaxValue(2.5002,30.003)
<<
endl;//MaxValue(2.5002,30.003)這也是一個模板函式
//當然由程式設計師自己指定也可以
//顯示呼叫
cout << MaxValue<int>(10,20)
<<
endl;
cout << MaxValue<double>(2.5002,30.003)
<<
endl;
}
void TestStack()
{
//測試模板類(整數)
Stack <int> intStack;//類别範本的例項化由程式設計師顯示的指定
intStack.Push(10);
intStack.Push(20);
intStack.Push(30);
while (intStack.HasElement())
{
cout << intStack.Pop()
<<
endl;
}
//測試模板類(浮點)
Stack <float> floatStack;//類别範本的例項化由程式設計師顯示的指定
floatStack.Push(1.001);
floatStack.Push(2.002);
floatStack.Push(3.003);
while (floatStack.HasElement())
{
cout << floatStack.Pop()
<<
endl;
}
//測試動態建立物件
//Stack建立的指標必須指明型別
Stack<int>* pInt
= new
Stack<int>();類别範本的例項化由程式設計師顯示的指定
pInt->Push(10);
pInt->Push(20);
pInt->Push(30);
while (pInt->HasElement())
{
cout << pInt->Pop()
<<
endl;
}
if ( pInt
!=
NULL)
{
delete pInt;
pInt = NULL;
}
}
相關文章
- 類别範本與函式模板的區別函式
- c++函式模板和類别範本C++函式
- 【C++ 泛型程式設計01:模板】函式模板與類别範本C++泛型程式設計函式
- C++知識點57——類别範本(2、類别範本的區域性特化與預設模板實參)C++
- 類别範本 單例模板單例
- C++ 類别範本的寫法C++
- 類别範本
- 類别範本與友元
- 類别範本與繼承繼承
- 類别範本中成員函式建立時機函式
- 【C++】 59_類别範本深度剖析C++
- C++ 單例類别範本(詳解)C++單例
- 【C++】 61_智慧指標類别範本C++指標
- 陣列類别範本陣列
- C++ Templates (2.3 類别範本的區域性使用 Partial Usage of Class Templates)C++
- 類别範本及其成員函式的定義及注意事項函式
- 類别範本的常見用法
- 類别範本物件做函式引數物件函式
- c++11-17 模板核心知識(二)—— 類别範本C++
- fill函式與memset函式的區別(c++)函式C++
- pua 八股類别範本
- C++ Templates (2.2 使用Stack類别範本 Use of Class Template Stack )C++
- C++ Templates (2.1 類别範本Stack的實現 Implementation of Class Template Stack)C++
- 隱藏在 SDK 中的單例類别範本單例
- C++學習筆記 第59課類别範本深度刨析C++筆記
- 類别範本的簡單應用(用於儲存不同型別資料的類容器)型別
- C++關於DLL匯出模板類和模板函式C++函式
- TransparentBlt、StretchBlt與BitBlt三個函式的區別函式
- c++函式模板C++函式
- 封裝不同類别範本的隨機數生成器封裝隨機
- C++模板函式實現型別推導C++函式型別
- 建構函式與普通函式的區別函式
- 箭頭函式與普通函式的區別函式
- C++函式模板案例C++函式
- 箭頭函式與普通函式區別函式
- python內建函式-eval()函式與exec()函式的區別Python函式
- TypeScript 中函式的理解?與 JavaScript 函式的區別?TypeScript函式JavaScript
- C++類將函式模板宣告為友元 例項C++函式
- 【演算法學習】數學專題 有理數類别範本演算法