C++对模板类的支持比较灵活,模板类的参数中除了可以有类型参数,还可以有普通参数。例如:

template<typename T, int N> class Demo{ };

N 是一个普通参数,用来传递数据,而不是类型,它与常见的函数中的参数一样,可以在类体中使用。这称为模板中的函数式参数。

T 用来传递数据的类型,N 用来传递数据的值,数据的值和类型都可以参数化,这是典型的面向对象编程思想。

为了演示模板中的函数式参数,下面我们来定义一个数组类:

#include <iostream>
using namespace std;
template<typename T, int N>
class Array{
public:
Array();
T & operator[]( int );
int length(){ return len; }
private:
int len;
T *p;
};
template<typename T, int N>
Array<T, N>::Array(){
p = new T[N];
len = N;
}
template<typename T, int N>
T & Array<T, N>::operator[](int i){
if(i< || i>=len)
cout<<"Exception: Array index out of bounds!"<<endl;
return p[i];
}
int main(){
Array<int, > arr;
int i, len = arr.length();
for(i=; i<len; i++){ //为数组元素赋值
arr[i] = *i;
}
for(i=; i<len; i++){ //遍历数组
cout<<"arr["<<i<<"] = "<<arr[i]<<endl;
}
return ;
}

本例中定义了一个模板类,它有一个类型参数 T 和一个普通参数 N,T 用来说明数组元素的类型,N 用来说明数组长度。

请注意代码第 33、36行,之所以能通过”[ ]“来访问数组元素,是因为重载了运算符”[ ]“,并且返回值是数组元素的引用。如果直接返回数组元素的值,那么将无法给数组元素赋值。

细心的读者可能发现,这段代码有内存泄露的风险,因为在构造函数中通过 new 分配了一段内存,却没有在析构函数中通过 delete 释放。

C++学习35 模板中的函数式参数的更多相关文章

  1. 7.3 C++模板中的函数式参数

    参考:http://www.weixueyuan.net/view/6400.html 总结: 模板类至少有一个类参数,但是可以有多个参数,这些参数中可以存在非类类型的参数. 类参数是指 class ...

  2. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. java基础知识 学习 关于URL中传递的参数含有特殊字符

    有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码                                   ...

  4. Python学习-35.Python中的List Comprehensions(列表解释|列表生成式)

    在某些情况下,我们需要对列表进行某些操作,例如对列表中的每一个元素都乘以2,这样一般来说就是遍历每个元素在乘以2.那么写下来就得两行了.而且这会修改原来的列表,如果要求不能修改原来的列表,又得多一行了 ...

  5. OpenCV学习(35) OpenCV中的PCA算法

    PCA算法的基本原理可以参考:http://www.cnblogs.com/mikewolf2002/p/3429711.html     对一副宽p.高q的二维灰度图,要完整表示该图像,需要m = ...

  6. Python学习---django模板语法180122

    django模板语法[Template] 模版的组成:  HTML代码+逻辑控制代码  <h1> {{ user_name }} </h1> 逻辑控制代码的组成: 1.变量: ...

  7. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

  8. Python框架学习之Flask中的Jinja2模板

    前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...

  9. C++17尝鲜:类模板中的模板参数自动推导

    模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...

随机推荐

  1. 014. asp.net实现记住密码的功能

    protected void Button1_Click(object sender, EventArgs e) { if (txtname.Text.Trim().Equals("mr&q ...

  2. 虚拟化之esxi命令行管理之二

    /vmfs # ls -l lrwxrwxrwx 1 root root 4 Mar 23 2013 devices -> /dev drwxr-xr-x 1 root root 512 Sep ...

  3. 2的N次方 【转】

    题目的链接为:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1009 题目为: 2的N次 ...

  4. OpenJudge就算概论-最长单词2【寻找句子内部最长的单词】

    /*===================================== 最长单词2 总时间限制: 1000ms 内存限制: 65536kB 描述 一个以'.'结尾的简单英文句子,单词之间用空格 ...

  5. Apache Kafka 分布式消息队列中间件安装与配置 转载

    bin/zkServer.sh start /home/guym/down/kafka_2.8.0-0.8.0/config/zookeeper.properties& bin/kafka-s ...

  6. HTTP请求方法对照表

    根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELE ...

  7. AndroidStudio 应用(一)

    1.下载安装,用上vpn了都: 2.配置模拟器,出现问题:VT-x is disabled in the BIOS for both all CPU modes (VERR_VMX_MSR_ALL_V ...

  8. serialVersionUID 的用途--转加自己的疑问

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  9. Oracle常用知识小结

    前言: 前一段时间项目开发数据库环境为Oracle,作为一个SQLer,表示各种不适应.所以刚开始的时候走了一些弯路,浪费了一席时间.因此就想把这些常用的东西给总结一下,算是对自己学习的总结,也希望能 ...

  10. 【虚拟化】支持IDE/SATA/SCSI

    驱动说明 IDE    :IDE和SATA是最常用的两种磁盘格式,基本每个系统上都会有: SATA:同IDE: SCSI :系统上一般缺少此驱动,需要手动安装: Linux下的名称 IDE硬盘:hd[ ...