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类做了总结 一.首先对该类的中的所有字段 ...
随机推荐
- es 高级
事务处理 _settings _refresh _flush 慢查询 存储模块 mmap local simplefs 缓存 IO 调节 热点线程 suggesters _suggest 端点 插件 ...
- add_polygon_to_map
var poly = new esri.geometry.Polygon({ "rings": [ [[117.008726, 30.931672], [117.009635, 3 ...
- ribbbitMq 教程,详细
https://blog.csdn.net/hellozpc/article/details/81436980
- node.js 递归创建多级目录
fs.mkdir只能创建一级目录,所以我们可以自定义一个mkdirs函数,利用递归和回调来实现创建多级目录. function mkdirs(dirname, callback) { //检测目录是否 ...
- 网站优化JS css压缩
在nginx 中开启gzip压缩后,可以大大减少资js css 体积,原来200KB,压缩后只有66KB server{ gzip on; gzip_types text/plain applicat ...
- java实现生成二维码
package com.cn.test; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.a ...
- ABAP-异常捕获
异常处理 基于类的异常exception classes 捕获 使用老式方式捕获catchable runtime errors 向上抛出异常 手动触发异常(类异常) 6.1版本以后,TRY…ENDT ...
- li直接1px 像素的原因
1.由于空白节点(多由于Enter造成),li不换行就可以解决问题. Internet Explorer会忽略节点之间生成的空白节点,其它浏览器不会忽略(可以通过检测节点类型,过滤子节点) 2.完美解 ...
- php初级之数组与 类初级
PHP 是后端脚本语言,回顾一下: 1.1 PHP 数组: <?php $user = array(); // 定义一个数组 $user[0] = 'zhangsan'; // 给数组赋值 $u ...
- openwrt用WEB刷固件型号不对问题强行处理
参照这里:https://blog.csdn.net/caoshunxin01/article/details/79355602 原机是一块mt7620A的通板,之前刷了一个叫WE826型号的固件,发 ...