C++之函式模板與類别範本的區別(三)

Bruce_0712發表於2017-05-22

函式模板與類别範本有什麼區別?答:函式模板的例項化是由編譯程式在處理函式呼叫時自動完成的,而類别範本的例項化 必須由程式設計師在程式中顯式地指定。


即函式模板允許隱式呼叫和顯式呼叫而類别範本只能顯示呼叫這期間有涉及到函式模板與模板函式,類别範本與模板類的概念(類似於類與類物件的區別)請看下面例子

注意:模板類的函式宣告和實現必須都在標頭檔案中完成,不能像普通類那樣宣告在.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;
    }
}

相關文章