1,一个类模板至少具有一个类参数,类参数是个符号以表示将要被某个确定数据类型代替的类型。

 #include<iostream>
#include<string> using namespace std; template <class T>
class Array {
public:
T& operator [](int);
const T& operator [](int);
Array(int);
~Array();
int get_size() const { return size;}
private:
char* a;
int size;
Array(); // 实例化的时候必须给出大小
T dummy_val;
}; template<class T>
T& Array<T>::operator [](int i) {
if(i < || i >= size) {
cerr << "index "<<i<<" out of bounds! ";
return dummy_val;
}
return a[i];
} template<class T>
T& Array<T>::operator [](int i) const {
if(i < || i >= size) {
cerr << "index "<<i<<" out of bounds! ";
return dummy_val;
}
return a[i];
} template<class T>
Array<T>::Array(int s) {
a = new T[size = s];
} template<class T>
Array<T>::~Array() {
delete[] a;
} template<class T>
ostream operator<<(ostream& os,const Array<T>& arr) { // 顶层函数重载
for(int i=;i<arr.get_size();++i)
os<<arr[i]<<endl;
return os;
}

模板类示例

由于 Array 类的参数化构造函数与重载的下标操作符在类声明之外定义,因此需要在定义之前加上模板头:template <class T>。

由于 Array 是个模板类,因此类名是 Array<T>,这里 T 是模板头的类参数。

2,类模板可以拥有多个类参数,这些参数用逗号隔开。每个类参数前都必须有关键字 class 或 typename。

 template<class T1,class T2,class T3>
class Sample {
public:
T2 m(T3 p) { } // expects a T3 arg,returns a T2
private:
T1 x; // var of type T1
};

多个类参数示例

3,模板实例:我们通过 < > 中指定数据类型来使用一个模板类。

 int main() {
Array<int> a1(); // Array of 10 int return ;
}

模板实例

以上语法表面用 int 来替换模板类 Array 声明的类参数 T,编译器会将在 Array 声明中所有的类参数 T 替换成 int。

用内建的或自定义的数据类型都可以创建模板实例

 class Task {  // user-defined data type
//...
}; Array<Task> tasks();

自定义类型实例

4,一个对象不能属于像 Array 或 Array<T> 的对象,但我们可以定义类型为 Array<int> 的对象。

5,参数表中的类模板:类模板可以作为一种数据类型出现在参数表中。

 template<class T>
ostream operator<<(ostream& os,const Array<T>& arr) { // 顶层函数重载
for(int i=;i<arr.get_size();++i)
os<<arr[i]<<endl;
return os;
}

模板类作为参数

6,模板的函数式参数:类模板必须至少有一个类参数,当然可以有多个类参数。类模板、还可以有非类参数的参数,一般称之为函数类型参数,一个模板类可以有多个函数类型参数,所有的参数用逗号分开。

 template<class T,int x,float Y>
class Sample {
//...
};

函数式参数

7,示例程序:模板堆栈类

 // stack
template<class T>
class Stack {
public:
enum{ DefaultSize = ,EmptyStack = -};
Stack();
Stack(int);
~Stack();
void push( const T&);
T pop();
T getNoPop() const;
bool empty() const;
bool full() const;
private:
T* elements;
int top;
int size;
void allocate() {
elements = new T[size];
top = EmptyStack;
}
void msg(const char* m) const {
cout << "***** "<<m<<" *****"<<endl;
}
template<class T>
friend ostream& operator<<(ostream& os,const Stack<T>&);
}; // Stack 类的实现
template<class T>
Stack<T>::Stack() {
size = DefaultSize;
allocate();
} template<class T>
Stack<T>::Stack(int s) {
if(s < )
s *= -;
else if(s == )
size = DefaultSize;
size = s;
allocate();
} template<class T>
Stack<T>::~Stack() {
delete[] elements;
} template<class T>
void Stack<T>::push(const T& e) {
assert(!full());
if(!full())
elements[++top] = e;
else
msg("Stack full!");
} template<class T>
T Stack<T>::pop() {
assert(!empty());
if(!empty())
return elements[top--];
else {
msg("Stack empty!");
T dummy_val;
return dummy_val; // 返回一个不确定的值
}
} template<class T>
T Stack<T>:: getNoPop() const {
assert(top > EmptyStack);
if(!empty)
return elements[top];
else {
msg("Stack empty!");
T dummy_val;
return dummy_val;
}
} template<class T>
bool Stack<T>::empty() const {
return top <= EmptyStack;
} template<class T>
bool Stack<T>::full() const {
return top + >= size;
} template<class T>
ostream& operator<<(ostream& os,const Stack<T>& s) {
s.msg("Stack contents:");
int t = s.top;
while(t > s.EmptyStack)
cout<<s.elements[t--]<<endl;
return os;
} int main() {
Stack<int> stk();
stk.push();
cout<<stk<<endl; return ;
}

Stack 类的实现

8,函数模板

 #include <iostream>
#include <stack>
using namespace std; // this is a function template
template<class Type>
Type maxValue(Type a,Type b) {
return a > b ? a : b;
} int main(){
stack<int> intStack; // 类模板的实例化只能由程序员显式指定
cout <<"模板函数隐式调用:" << maxValue(,) << endl;
cout << "模板函数显式调用:" << maxValue<double>(1.1,2.2) <<endl;
return ;
}

类模板和函数模板实例

note:类模板只能通过显式的调用生成模板类; 函数模板可以通过显式调用或隐式调用生成模板函数。

c++中的类(class)-----笔记(类模板)的更多相关文章

  1. Xcode6中如何使用自定义的类模板

    说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...

  2. YTU 2618: B 求类中数据成员的最大值-类模板

    2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec  内存限制: 128 MB 提交: 430  解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...

  3. JavaFx 中常见的包和类(javafx笔记 )

    JavaFx 中常见的包和类(javafx笔记 ) 更多详细内容请参考<Pro JavaFX 8>. javafx.stage 包包含以下类: Stage 类 ​ Stage 类是任何 J ...

  4. zt C++ list 类学习笔记

    C++ list 类学习笔记 分类: C++ 2011-09-29 00:12 7819人阅读 评论(0) 收藏 举报 listc++iteratorvectorcconstructor 双向循环链表 ...

  5. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  6. 设计模式学习起点 UML类图笔记

    UML类图笔记 大学开设的软件设计课程一般都会学习UML类图,大部分关于设计模式的描述都是使用的UML类图,可以说类图的表示是学习设计模式的起点.UML定义类之间的关系主要有六种:泛化关系.实现关系. ...

  7. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  8. 《Java编程思想》读书笔记-类与对象

    欢迎各位读者关注我的微信公众号,共同探讨Java相关技术.生命不止,学习不休! 也许你慢慢地对程序有了这样的认识:程序只是一些列带有方法的对象的组合,这些方法以其它对象为参数,可在任何地方返回,并发送 ...

  9. GUI学习之五——QAbstractButton类学习笔记

    今天总结一下AbstractButton类的学习笔记. 一.描述 AbstractButton是对各种按键的抽象类他的继承关系是这样的 首先,QAbstractButton继承了QWidget类的各种 ...

  10. System类学习笔记

    最近在学习源码的过程中发现:很多深层次的代码都用到了一个类System类,所以决定对System类一探究竟 本文先对System类进行了剖析,然后对System类做了总结 一.首先对该类的中的所有字段 ...

随机推荐

  1. docker 报ls: cannot open directory software/: Permission denied

    问题原因及解决办法 原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题: 1.在运行容器的时候,给容器加特权,及加上 --privileged= ...

  2. 02.photoshop制作透明图片步骤

    1.首先打开PS软件和图片如下.文件-新建. 2.如下图背景内容选择-透明.在确定. 3.出现了白底这就是透明的. 4.将图片背景都去除 5.在选择文件-存储为 6.格式选择.GIF的文件.其它不是透 ...

  3. H5视频推流方案

    导语 随着直播平台爆发式增长,直播平台从 PC 端转战移动端,紧跟着直播的潮流,自己学习实现了一套简单的 H5 视频推流的解决方案,下面就给小伙伴们分享一下自己学习过程中的经验. 环境部署 1. 配置 ...

  4. 通过Sonar的代码质量报告学习【如何写安全高质量的代码】

    1.不要用.size(),改用isEmpty() Using Collection.size() to test for emptiness works, but using Collection.i ...

  5. day27-反射

    1.介绍 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语 ...

  6. django 之Paginator

    Django自身提供了一些类来实现管理分页,数据被分在不同的页面中,并带有“上一页/下一页”标签.这个类叫做Pagination,其定义位于 django/core/paginator.py 中. p ...

  7. myeclipse提示错误。

    Syntax error, parameterized types are only available if source level is 1.5 解决方法:编译器问题.注意myeclipse10 ...

  8. HTML:Registry design.(Include a simple web design use HTML)

    Registry design: I feel a little bored when I design this registry,so T design a simple website all ...

  9. NetStream 记录

    bufferLength : Number [只读] 数据当前存在于缓冲区中的秒数.(已进入缓冲区的秒数) bufferTime : Number 指定在开始显示流之前需要多长时间将消息存入缓冲区.( ...

  10. debian下redis2.8.17安装过程

    下载redis源码包,我下载的是redis2.8.17 解压缩该源码包 tar zxf redis-2.8.17.tar.gz 进入解压缩后的目录 cd redis-2.8.17/ 添加redis用户 ...