c++中的类(class)-----笔记(类模板)
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)-----笔记(类模板)的更多相关文章
- Xcode6中如何使用自定义的类模板
说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...
- YTU 2618: B 求类中数据成员的最大值-类模板
2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec 内存限制: 128 MB 提交: 430 解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...
- JavaFx 中常见的包和类(javafx笔记 )
JavaFx 中常见的包和类(javafx笔记 ) 更多详细内容请参考<Pro JavaFX 8>. javafx.stage 包包含以下类: Stage 类 Stage 类是任何 J ...
- zt C++ list 类学习笔记
C++ list 类学习笔记 分类: C++ 2011-09-29 00:12 7819人阅读 评论(0) 收藏 举报 listc++iteratorvectorcconstructor 双向循环链表 ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 设计模式学习起点 UML类图笔记
UML类图笔记 大学开设的软件设计课程一般都会学习UML类图,大部分关于设计模式的描述都是使用的UML类图,可以说类图的表示是学习设计模式的起点.UML定义类之间的关系主要有六种:泛化关系.实现关系. ...
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- 《Java编程思想》读书笔记-类与对象
欢迎各位读者关注我的微信公众号,共同探讨Java相关技术.生命不止,学习不休! 也许你慢慢地对程序有了这样的认识:程序只是一些列带有方法的对象的组合,这些方法以其它对象为参数,可在任何地方返回,并发送 ...
- GUI学习之五——QAbstractButton类学习笔记
今天总结一下AbstractButton类的学习笔记. 一.描述 AbstractButton是对各种按键的抽象类他的继承关系是这样的 首先,QAbstractButton继承了QWidget类的各种 ...
- System类学习笔记
最近在学习源码的过程中发现:很多深层次的代码都用到了一个类System类,所以决定对System类一探究竟 本文先对System类进行了剖析,然后对System类做了总结 一.首先对该类的中的所有字段 ...
随机推荐
- winform 布局、容器
一.布局 属性:1.Anchor: 绑定控件到容器边缘位置保持不变 注:四周全锁定时控件随界面变化时变大 2.Dock:绑定到容器的边缘 注:下控件到边需先将下控件定义到边再将左右控件新建.到边 3 ...
- jenkins部署配置
https://www.cnblogs.com/rslai/p/8135460.html 修改jenkins的默认端口号: https://blog.csdn.net/qq_32440951/arti ...
- spark快速大数据分析
从上层来看,每个Spark 应用都由一个驱动器程序(driver program)来发起集群上的各种并行操作.驱动器程序包含应用的main 函数,并且定义了集群上的分布式数据集,还对这些分布式数据集应 ...
- Flex4学习笔记1---基本语法
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- DDD领域驱动设计(例子)
参考:https://tech.meituan.com/DDD_in_%20practice.html
- ubuntu16.04搭建geodjango+postgresql+postgis的WebGIS框架(二))安装postgresql和postgis
卸载老版本sudo dpkg --purge postgis postgresql-9.3-postgis1.安装postgresql sudo apt-cache search postgresql ...
- PE 装机
PE 装机 下载PE安装到硬盘启动. 下载win7安装原始文件ISO镜像文件,解压ISO到文件夹. 重启电脑,选择PE菜单. 打开windows安装器大全>选择 winntSetup> i ...
- NetStream 记录
bufferLength : Number [只读] 数据当前存在于缓冲区中的秒数.(已进入缓冲区的秒数) bufferTime : Number 指定在开始显示流之前需要多长时间将消息存入缓冲区.( ...
- 【380】python 获取列表排序后的索引列表
参考:Equivalent of Numpy.argsort() in basic python? - Stack Overflow 通过 enumerate 实现 [i for i,v in sor ...
- Shell编程常用函数
1.打印提示消息函数,不同级别消息使用不同的颜色显示.其中错误信息提示为红色字体. # -------------------------------------------------------- ...