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. 详解一个ThreadLocal 的谜题

    多线程如果不理解透彻, 那么 ThreadLocal 始终是有些会有所迷糊的. ThreadLocal 本身的命名有有问题, 这些美国精英整出来的技术,再加上一个奇怪的命名.对我们中国人来说,就是一场 ...

  2. 【ASP.NET 进阶】TreeView控件学习

    这几天上班没事做,也不好打酱油,学点没接触过的新东西吧,基本了解了下TreeView控件. TreeView 控件用于在树结构中显示分层数据,例如目录或文件目录等. 下面看代码吧: 1.效果图 2.静 ...

  3. Shell 编程 (变量和条件测试)

    变量: 1 . 变量声明 直接使用变量 + 赋值 #!/bin/bash NAME='HELLO WORD' echo $NAME 使用 declare 关键字声明 declare(选项)(参数) + ...

  4. win10 死机 无响应

    win10 死机 无响应 用着用着无响应,结束任务出不来,ctrl+alt+delete  无效. 点 窗口的关闭关闭不了. 鼠标键盘无响应. 写的代码变成乱码,影响太严重了,损失惨重. 紧急启动 c ...

  5. centos7 自动定时备份mysql数据库

    shell脚本:mysqlbak.sh #!/bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbinexpo ...

  6. upcast

    class A { public: A():i(){} int get_i() { cout << "A.get_i" << endl; return i; ...

  7. Delphi 文件目录相关的操作函数

    需要User   SysUtils 取文件名 ExtractFileName(FileName); 取文件扩展名: ExtractFileExt(filename); 取文件名,不带扩展名: 方法一: ...

  8. JSP页面中的小知识

    1.<%…%>和<%!…%>的区别? <%…%>用于在JSP页面中嵌入Java脚本,即代码块 <%!…%>用于在JSP页面中申明变量或方法,可以在该页面 ...

  9. C# WInForm中 窗体的this.width和this.height的属性值不能大于显示器的最大分辨率

    最近在做一个小项目的时候,发现在 1680x1050 分辨率显示器上写的代码,将窗体的宽度和高度 设置成了 1600×900,在高于1600×900的分辨率上缩放显示很正常, 而后转移到 分辨率低于 ...

  10. 连接mysql连接不上遇到的问题

    连接不上mysql ,启动mysqld进程,发现可以启动成功,但几秒后进程立马关闭了,后来发现主要原因是因为磁盘空间满了. 报错: Can't connect to local MySQL serve ...