参考:http://www.weixueyuan.net/view/6398.html

总结:

  模板是另一种代码重用机制。

  需要设计的几个类,其功能都是一样的,仅仅只是需要操作的数据类型不同。 有更好的方法:设计一个模板类。

  定义模板类array时,前面加上了一句声明:    template< class T > 该语句称为模板头,可以单独放在一行,也可以与后面的class array同放在一行,这都没有关系。模板头中的“T”我们称之为类参数,类参数表示将会以确定的数据类型替代之,任何有效的C++标识符均可以作为类参数,当然通常我们还是会用“T”来做类参数

  对于模板类而言,在类外定义类中的成员函数的时候都需要加上模板头。同时由于array是个模板类,因此类名是array< T >,故而在类外定义带参构造函数的完整形式是:  

  模板类至少有一个类参数,但是可以有多个类参数,每一个类参数前都必须有关键字class或者类型名。

C++提供了多种代码重用机制,在前面介绍派生和继承时,派生类可以继承基类中的成员变量和成员函数。模板是另一种代码重用机制。 

有时候在设计程序的时候会遇到这样一种情况:需要设计的几个类,其功能都是一样的,仅仅只是需要操作的数据类型不同。遇到这样的情况,固然可以将所有的类都设计一遍,但是在C++中,我们有更好的方法:设计一个模板类。假设我们需要创建一个数组类,该数组可能是整型数组,也可能是double类型数组、string类型数组等,为此我们需要设计一个数组的模板类。

例1:

template< class T >
class array
{
public:
array( int );
T & operator[]( int );
const T & operator[] ( int )const;
int getlen()const{ return length; }
~array();
private:
array(){};
int length;
T * num;
}; template < class T >
array< T >::array( int n )
{
num = new T[n];
length = n;
} template < class T >
array< T >::~array()
{
delete[] num;
} template< class T >
T & array< T > ::operator[] (int i)
{
if( i < || i >= length)
throw string("out of bounds");
return num[i];
} template< class T >
const T & array< T > ::operator[] (int i) const
{
if( i < || i >= length)
throw string("out of bounds");
return num[i];
} template< class T >
ostream & operator<<(ostream & out, const array <T> & A)
{
for(int i=; i < A.getlen(); i++)
out<< A[i] << " ";
return out;
}

在本例中,我们定义了一个数组的模板类array,借用该示例,我们来了解一下模板类的一些基本语法。在本例中我们定义模板类array时,前面加上了一句声明:
    template< class T >
该语句称为模板头,可以单独放在一行,也可以与后面的class array同放在一行,这都没有关系。模板头中的“T”我们称之为类参数,类参数表示将会以确定的数据类型替代之,任何有效的C++标识符均可以作为类参数,当然通常我们还是会用“T”来做类参数。

模板头中template关键字和“<”之间可以保留一个空格,但通常这两者之间不留空格。

对于模板类而言,在类外定义类中的成员函数的时候都需要加上模板头。同时由于array是个模板类,因此类名是array< T >,故而在类外定义带参构造函数的完整形式是:

template < class T >
T & array< T >::array( int n )
{
num = new T[n];
length = n;
}

而如果是在类内部定义该函数,则会相对简单一些:

array( int n )
{
num = new T[n];
length = n;
}

在本例中用到了前面所介绍的很多知识点,例如将默认构造函数置为private属性,重载下标操作符,重载输出操作符等,这些知识点希望能够仔细领会。

模板类至少有一个类参数,但是可以有多个类参数,每一个类参数前都必须有关键字class或者类型名。

例2:

template< class T, class S, class R>
class test
{
public:
S fun( R r);
private:
T x;
};

本例就是一个具有多个类参数的模板类示例。

7.1 C++模板基本概念及语法 《C++模板与标准模板库》的更多相关文章

  1. C++学习笔记——STL(标准模板库)

    1.首先.需要学习C++ 模板的概念 2.C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表. ...

  2. Sitecore标准模板字段

    在Sitecore中,数据模板定义数据类型.数据模板可以包含任意数量的节,其中每个节可视地分组一些字段.Sitecore标准模板为大多数其他数据模板定义了基本模板./ sitecore / templ ...

  3. C++中类模板的概念和意义

    1,在 C++ 中是否能够将泛型的思想应用于类? 1,函数模板是将泛型编程的思想应用于函数,就有了函数模板: 2,可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将 ...

  4. T4模板之初体验(语法)

    一.什么是T4模板 T4是Text Template Transformation Toolkit(文本模板转换工具包)的四个英文首字母的简称.是微软提供的一种代码生成引擎. 在ADO.NET实体数据 ...

  5. C#中区别多态、重载、重写的概念和语法结构

    C#中区别多态.重载.重写的概念和语法结构 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式: 基类中: public virtual ...

  6. STL模板_概念

    模板和STL一.模板的背景知识1.针对不同的类型定义不同函数版本.2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引 入风险.3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的 具体函 ...

  7. ThinkPHP 3.1.2 模板中的基本语法<1>

    # # ThinkPHP 3.1.2 模板中的基本语法 一.传统的方式,导入CSS和JS文件 1.css link js scr <link rel='stylesheet' type='tex ...

  8. 学习 JavaScript (三)核心概念:语法、变量、数据类型

    JavaScript 的核心概念主要由语法.变量.数据类型.操作符.语句.函数组成,这篇文章主要讲解的是前面三个,后面三个下一篇文章再讲解. 01 语法 熟悉 JavaScript 历史的人应该都知道 ...

  9. STL(标准模板库)基本概念

    一.什么是STL STL(Standard Template Library,标准模板库)的从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),容器 ...

随机推荐

  1. (转)C#中base关键字的几种用法

    base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法.例如: 2.1关于base调用基类构造函数 public c ...

  2. 最大似然估计实例 | Fitting a Model by Maximum Likelihood (MLE)

    参考:Fitting a Model by Maximum Likelihood 最大似然估计是用于估计模型参数的,首先我们必须选定一个模型,然后比对有给定的数据集,然后构建一个联合概率函数,因为给定 ...

  3. Java类成员变量的默认值

    1.布尔型(boolean)变量默认值为false,byte.short.int.long为0,字符型为'\u0000'(空字符),浮点型(float double)为0.0,引用类型(String) ...

  4. 自动化(脚本)安装httpd服务

    思路: 1.检查传递的参数,httpd源码文件 2.检查执行脚本的用户是否为root 3.检查rpm是否安装过httpd,若安装过,则卸载 4.安装编译所需的工具 5.从网上下载httpd源码 6.配 ...

  5. Codeforces Beta Round #64D - Professor's task

    题意:两种操作1.加点2.查询点是否在之前给定点的凸包内 题解:set维护动态凸包,分别维护上下凸壳,对y取反就行,判断点是否在凸壳内,把点加进去看要不要删除就好了 //#pragma GCC opt ...

  6. zsh切换bash bash切换zsh

    切换bash(需要sudo) chsh -s /bin/bash 切换zsh(不需要sudo) chsh -s /bin/zsh 注意:如果输入命令和密码后提示:no change made. 请加上 ...

  7. Opatch使用细则

    Patch 21352635 - Database Patch Set Update 11.2.0.4.8 一.OPatch工具检查及升级 OPatch工具包,在安装目录$ORACLE_HOME下,P ...

  8. CRM WEB UI 04明细界面添加按钮

    好了,这个是个人测试玩的,略风骚...请自行鉴阅 1.明细的组件控制器中增加全局控制属性字段: 2.概览页中工具栏相关方法,重定义GET_BUTTONS METHOD IF_BSP_WD_TOOLBA ...

  9. [hdu 6191] Query on A Tree

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  10. python字符串内建函数