函数模板与类模板的区别

本文深入解析了函数模板与类模板的区别,重点介绍了它们在实例化过程中的不同特性。通过具体的代码示例,展示了如何实现通用的函数模板和类模板,并讨论了模板类的声明与实现必须在同一文件中的原因。

函数模板与类模板有什么区别?答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 
必 须由程序员在程序中显式地指定。

 

即函数模板允许隐式调用和显式调用而类模板只能显示调用

 

这期间有涉及到函数模板与模板函数,类模板与模板类的概念 (类似于类与类对象的区 别)

请看下面例子

 

注意:模板类的函数声明和实现必须都在头文件中完成,不能像普通类那样声明在.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 ; 
    } 
}



函数模板类模板都是C++中的泛型编程工具,它们允许程序员编写类型无关的代码,从而提高代码复用性和灵活性。以下是两者的主要区别: ### 1. 定义和用途 - **函数模板**:用于定义一组相关的函数,这些函数可以处理不同类型的数据,而不需要为每种数据类型单独编写函数。例如,`std::swap` 就是一个常见的函数模板,它可以交换任意类型的两个变量值。 - **类模板**:用于创建一系列相关的类,每个类都可以针对特定的类型实例化。这使得我们可以根据需要生成适用于各种数据类型的容器或其他复杂结构。如 `std::vector<T>` 是一个典型的类模板例子。 ### 2. 实现细节 - **函数模板**:通常只包含单一的功能实现,并通过传入的不同类型参数自动推导出实际使用的版本。它强调的是功能上的通用性。 示例: ```cpp template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; } ``` - **类模板**:不仅能够存储多种类型的元素,还可以提供丰富的成员方法操作这些元素,同时支持更复杂的内部逻辑设计。它更侧重于构建一种通用的数据结构框架。 示例: ```cpp template <class T> class Stack { private: vector<T> elems; // 元素 public: void push(T const&); void pop(); T top() const; bool empty() const { return elems.empty(); } }; ``` ### 3. 使用场景 - 如果只是想让某个独立的操作作用到不同类型的对象上,则应该选择使用“函数模板”;如果需要构造某种能容纳并管理大量同类项目集合体之类的抽象机制,“类模板”会更适合。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值