`

C++模板浅谈

阅读更多


1.  模板的概念。

我们已经学过重载(Overloading) ,对重载函数而言,C++ 的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值 ,我们定义MAX() 函数需要对不同的数据类型分别定义不同重载(Overload) 版本。

// 函数1.

int max(int  x,int  y);
{return(x>y)?x:y ;}

// 函数2.
float max( float  x,float  y){
return (x>y)? x:y ;}

// 函数3.
double max(double  x,double  y)
{return (c>y)? x:y ;}

但如果在主函数中,我们分别定义了 char a,b;  那么在执行max(a,b); 时 程序就会出错,因为我们没有定义char 类型的重载版本。

现在,我们再重新审视上述的max() 函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++ 引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

2.    函数模板的写法

函数模板的一般形式如下:

Template <class 或者也可以用typename  T>

返回类型 函数名(形参表)
{//
函数定义体 }

说明: template 是一个声明模板的关键字,表示声明一个模板关键字class 不能省略,如果类型形参多余一个 ,每个形参前都要加class < 类型 形参表> 可以包含基本数据类型可以包含类类型.

请看以下程序:

//Test.cpp

#include  <iostream>

using  std::cout;

using  std::endl;

// 声明一个函数模版, 用来比较输入的两个相同数据类型的参数的大小,class 也可以被typename 代替,

//T 可以被任何字母或者数字代替。

template  <class  T>

T min(T x,T y)

return (x<y)?x:y;}

void  main( )

{

      int  n1=2,n2=10;

      double  d1=1.5,d2=5.6;

      cout<< " 较小整数:" <<min(n1,n2)<<endl;

      cout<< " 较小实数:" <<min(d1,d2)<<endl;

      system("PAUSE" );

}

程序运行结果: 

 

程序分析:main() 函数中定义了两个整型变量n1 , n2  两个双精度类型变量d1 , d2 然后调用min( n1, n2);  即实例化函数模板T min(T x, T y) 其中T为int 型,求出n1,n2 中的最小值.同理调用min(d1,d2) 时,求出d1,d2 中的最小值.

3.  类模板的写法

定义一个类模板:

Template < class 或者也可以用typename  T >
class
类名{
//类定义......
};

说明:其中,template 是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。

例如:定义一个类模板:

// ClassTemplate.h
#ifndef  ClassTemplate_HH

#define  ClassTemplate_HH

template <typename  T1,typename  T2>

class  myClass{

private :

      T1 I;

      T2 J;

public :

      myClass(T1 a, T2 b);//Constructor

      void  show();

};

// 这是构造函数

// 注意这些格式

template  <typename  T1,typename  T2>

myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

// 这是void show();

template  <typename  T1,typename  T2>

void  myClass<T1,T2>::show()

{

      cout<<"I=" <<I<<", J=" <<J<<endl;

}

#endif

// Test.cpp

#include  <iostream>

#include  "ClassTemplate.h"

using  std::cout;

using  std::endl;

void  main()

{

      myClass<int ,int > class1(3,5);

      class1.show();

      myClass<int ,char > class2(3,'a' );

      class2.show();

      myClass<double ,int > class3(2.9,10);

      class3.show();

      system("PAUSE" );

}

最后结果显示:

 

4.非类型模版参数

一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。

那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。


template <typename  T, int  MAXSIZE>

class  Stack{

Private:

        T elems[MAXSIZE];

};

Int main()

{

        Stack<int , 20> int20Stack;

        Stack<int , 40> int40Stack;

};

 

分享到:
评论

相关推荐

    浅谈C++模板实现模块间参数传递及回调

    一篇关于C++模板 设计模式 软件架构的文档,里面实现了一个泛化的命令模式和观察者模式

    yxy版c++教程 浅谈矩阵快速幂

    在C++中,矩阵快速幂可以通过模板实现,提高了计算效率。 矩阵概念 矩阵是指纵横排列的二维数据表格,同质上是一个m*n的二维数组。矩阵可以用于表示图像、信号处理、机器学习等领域的数据。矩阵乘法是矩阵运算的...

    浅谈C++模板元编程

    C++模板元编程 C++模板元编程是C++语言中的一种编程技术,它允许程序员在编译期生成代码,提高程序的执行效率和灵活性。C++模板元编程的核心是模板,模板是一种高级抽象机制,允许程序员在编译期生成代码。 C++...

    浅谈C++容器.pdf

    本文旨在通过解析《浅谈C++容器》的内容,帮助读者深入了解C++容器的基本概念、分类及其背后的原理。 #### 二、容器的基本概念 容器是C++标准库中用于存储和管理数据的一种机制。它们提供了一种高效的方式来组织和...

    浅谈C++容器

    C++容器是C++标准模板库中提供的一组通用的容器类,总共有10种,它们可以解决程序中遇到的许多问题。这些容器的实现都是基于数据结构的基本知识,它们是对数据结构的实例化。因此,了解数据结构的概念是非常重要的。...

    c++指针和引用的使用浅谈

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,并通过实例来对比它们的使用方法和特性。 首先,指针是C++中的一种特殊类型,它存储的是一个...

    浅谈C++之模板

    模板是C++泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。 什么是模板 假定我们希望编写一个函数来比较两个值,并指出第一个值是小于、等于还是大于等于第二值。在实际中,我们可能想要定义多个函数...

    C++开发工具之-QT浅谈 QT集成开发环境 QT IDE

    QPointer模板类是QT对C++指针的一种增强,它可以检测并处理对象生命周期,防止野指针的出现。配合QObjectCleanupHandler,QT提供了自动垃圾回收机制,减少了内存泄漏的风险。 在性能方面,QT充分利用了C++的高效性...

    浅谈c语言和c++和VB的区别.docx

    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密...

    浅谈C++内存分配及变长数组的动态分配

    在C++编程中,内存管理是一项关键技能,尤其是在涉及动态分配和变长数组时。本文将探讨C++的内存分配机制以及如何动态分配变长数组。 首先,C++中的内存分配有三种主要方式: 1. **静态存储区域分配**:这部分内存...

    浅谈C++11新引入的lambda表达式

    `std::function`模板类也是与lambda表达式密切相关的一个工具,它能将任何具有特定签名的函数(包括lambda表达式)封装成一个统一的类型,方便存储和传递。 总之,C++11的Lambda表达式提供了一种简洁、强大的方式来...

    侯克林 C++.rar

    侯克林老师作为一位资深的C++教育者,他的课程资料深入浅出,深受学习者喜爱。这次分享的“houkelin 老师课件”正是他教学经验的结晶,包含了STL(标准模板库)、指针操作以及内存管理等核心知识点。 首先,我们来...

    浅谈Python程序与C++程序的联合使用

    因此,如果需要与C++代码交互,C++程序员必须提供符合C语言调用约定的接口,且不能使用类、重载函数、模板和C++异常。此外,ctypes对Python的数据类型如list和set的自动转换支持不是很好,可能需要额外的Python代码...

    著名IT公司首席架构师梁岳传博士谈C++的发展

    【梁岳传博士谈C++的发展】 在IT领域,C++作为一门强大的编程语言,一直以其高效、灵活性和面向对象的特性备受推崇。著名IT公司首席架构师梁岳传博士,以其深厚的C++造诣,深入浅出地探讨了C++的发展历程与未来趋势...

    C++技术

    2. **浅谈Visual C++中的预编译.doc** 预编译(Preprocessor)是C++编译过程的一部分,它在实际编译之前处理源代码,如替换宏定义、处理条件编译指令等。Visual C++是Microsoft提供的C++开发工具,其预编译功能可能...

    c++程序设计语言课本后习题

    《C++程序设计语言》是一本经典的编程教材,由Bjarne Stroustrup编写,它深入浅出地介绍了C++语言的基本概念、语法和高级特性。这个压缩包包含的是一系列与课本配套的课后习题解答,由作者谈宇翔提供。尽管他指出...

    浅谈C++中的string 类型占几个字节

    `sizeof(string)`通常返回的是`std::string`类模板实例化后的大小,这个大小是固定的,因为它包含了指针和长度等固定成员的大小。 在G++编译器下,`std::string`可能只占4个字节,这通常是因为指针和长度信息都被...

    浅谈VC++工程的文件组织 .docx

    C++标准库中的`&lt;iostream&gt;`是C++标准模板库的一部分,提供流操作,如`std::cout`。不同于旧的C++库中的`iostream.h`,`&lt;iostream&gt;`包含了模板支持,更符合现代C++的编程风格。 总的来说,良好的VC++工程文件组织有...

    C,C++经典推荐博文汇总

    C++模板机制允许编写泛型代码,减少代码重复,提高代码复用性。利用模板,可以在不牺牲性能的情况下,避免不必要的强制类型转换,增强代码的类型安全性和可读性。 #### C语言学习中的变参处理 C语言支持可变参数...

Global site tag (gtag.js) - Google Analytics