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类做了总结 一.首先对该类的中的所有字段 ...
随机推荐
- java -version 问题 : C:\ProgramData\Oracle\Java\javapath;
我把 JAVA_HOME 从8改成了 7 , 为什么还是 显示的8啊 ! E:\sv0\jars>java -version java version "1.8.0_111" ...
- makefile中 $@, $^, $<, $?含义
$@ 表示目标文件 $^ 表示所有的依赖文件 $< 表示第一个依赖文件 $? 表示比目标还要新的依赖文件列表 例子 root_num.exe: root_num.o my_root.o gcc ...
- mysql存储过程使用游标循环插入数据
DELIMITER $$ DROP PROCEDURE IF EXISTS `procedure_course`$$ CREATE DEFINER=`root`@`localhost` PROCEDU ...
- Boolean类型
Boolean类型是与布尔值对应的引用类型.如果要创建Boolean对象,语法如下: var booleanObject = new Boolean(true); Boolean类型的实例重写了val ...
- js 引入外部文件之 script 标签
在我的理解看来,html 就是一个单纯的管显示问题,js就是单纯的管动作问题,css就是单纯的管布局问题,这三个构成了一个网页 在HTML中,经常会用到引入js 文件. 引入js的方法很简单: 1. ...
- 剑指OFFER例题——从尾到头打印链表
/** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val ...
- jenkins系列_使用scp命令进行远程文件复制遇到的坑
转自:https://blog.csdn.net/kingboyworld/article/details/78905553 一.场景介绍 项目为微服务项目,使用jenkins进行统一部署.基本思路是 ...
- Java设置运行时环境参数
一.代码中,如下: System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", " ...
- debian9 下编译安装tengine2.2.1
首先下载tengine的源码包,这个大家都会下载吧 wget http://tengine.taobao.org/download/tengine-2.2.1.tar.gz 然后解压缩 tar zxf ...
- Unity系列文章
1.IoC模式:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html 这篇博客是通过一个播放器的例子来说明什么是依赖,依赖倒置,控 ...