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++中模板_類别範本的宣告和定義C++
- C++ 類别範本的寫法C++
- c++佇列類别範本的實現C++佇列
- 【C++】 59_類别範本深度剖析C++
- C++ 單例類别範本(詳解)C++單例
- 非型別的類别範本引數型別
- 陣列類别範本陣列
- 【C++】 61_智慧指標類别範本C++指標
- 進階篇_STL詳解(函式模板特化,類别範本特化,用模板實現自己的通用演算法)函式演算法
- C++ Templates (2.3 類别範本的區域性使用 Partial Usage of Class Templates)C++
- 類别範本及其成員函式的定義及注意事項函式
- 類别範本的常見用法
- c++11-17 模板核心知識(二)—— 類别範本C++
- 函式過載與函式模板的區別函式
- C++ Templates (2.2 使用Stack類别範本 Use of Class Template Stack )C++
- C++的一個簡單的控制程式碼類别範本C++
- C++ Templates (2.1 類别範本Stack的實現 Implementation of Class Template Stack)C++
- fill函式與memset函式的區別(c++)函式C++
- 隱藏在 SDK 中的單例類别範本單例
- C++學習筆記 第59課類别範本深度刨析C++筆記
- 自定義 Xcode ViewController 類别範本XCodeViewController
- 類别範本的簡單應用(用於儲存不同型別資料的類容器)型別
- 封裝不同類别範本的隨機數生成器封裝隨機
- c++函式模板C++函式
- 類别範本繼承和部分具體化例子及非型別引數繼承型別
- C++的函式和模板函式 (轉)C++函式
- TransparentBlt、StretchBlt與BitBlt三個函式的區別函式
- Effective c++(筆記)----類與函式之實現C++筆記函式
- 建構函式與普通函式的區別函式
- 箭頭函式與普通函式的區別函式
- append()函式與html()函式的區別APP函式HTML
- C++模板函式實現型別推導C++函式型別
- 【演算法學習】數學專題 有理數類别範本演算法