模板函数和模板类的区别

2019-04-14 12:00发布

惊恐函数模板与类模板的区别 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 
必 须由程序员在程序中显式地指定。
  即函数模板允许隐式调用和显式调用而类模板只能显示调用   这期间有涉及到函数模板与模板函数,类模板与模板类的概念 (类似于类与类对象的区 别) 请看下面例子   注意:模板类的函数声明和实现必须都在头文件中完成,不能像普通类那样声明在.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> 
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 ; 
    } 
}