类模板学习总结

1.类模板就是给普通的类加上一个参数,参数可以是未知数据类型标识(如int, string,char, class等),也可以是已知数据类型的值,在下面的第二个例子中,类模板参数实例化会生成一个新的类,这个类中的高与宽是确定的,用该类可以实例化对象,在这个对象中,这两个值也是确定的。

template <typename Type>
template <typename T>
class CQueueItem;
template <typename Type>
class CQueue
{
public:
  CQueue();
  ~CQueue();
  Type& remove();
  void add(const Type &);
  bool is_empty();
  bool is_full();
private:
  CQueueItem<Type> * head;
  CQueueItem<Type> * tail;
};
template <int hi, int wid>
class Screen {
public:
Screen() : _height( hi ), _width( wid ), _cursor ( 0 ),
_screen( hi * wid, `#' )
{ }
// ...
private:
string _screen;
string::size_type _cursor;
short _height;
short _width;
};
typedef Screen<24,80> termScreen;
2.另外一个问题是效率问题,看下面这个例子
termScreen hp2621;
template <class Type>
class QueueItem {
// ...
public:
// 可能效率很低
QueueItem( const Type &t ) {
item = t; next = 0;
}
};

如果模板实参是一个具有构造函数的类例如string 它将导致item 被初始化两次 在QueueItem 的构造函数体执行之前string 的缺省构造函数被调用来初始化item 然后 新构造的item 又被按成员赋值在QueueItem 构造函数的定义中我们只需在构造函数成员 初始化表中显式地初始化item 就可以解决这个问题:

template <class Type>
class QueueItem {
// ...
public:
// 在构造函数成员初始化表中初始化 item
QueueItem( const Type &t )
: item(t) { next = 0; }
};

3.注意模板声明与定义的区别 4.实参的类型与大小要确定,在实例化类模板时要注意实参一定要有确知类型和大小. CQueue myQueue; 错误,类型不确定,这种错误比较容易避免,因为词法上通不过。 再看下一下: template <int *ptr> class BufPtr { ... }; BufPtr< new int[24] > bp; 错误,因为那么它的实例将导致编译错误因为来自操作符new()调用结果的指针值只有到运行时刻才能被知道,这样编译时通不过,因为"模板实参不能在编译时刻被计算出来",因为编译时要分配内存,所以,类型与大小必须要确知。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python提取任意长度整数的每位数字

问题描述:编写函数,给定一个任意长度整数,返回每位数字,例如给定1234则返回(1, 2, 3, 4)。问题本身并不复杂,主要演示Python运算符和内置函数的...

34950
来自专栏鸿的学习笔记

一句话讲明白基本排序

4520
来自专栏代码世界

Python基础数据类型之int、bool、str

数据类型:int  bool  str  list  元祖  dict  集合 int:整数型,用于各种数学运算。 bool:只有两种,True和False,用...

34660
来自专栏章鱼的慢慢技术路

追踪状态——消息解码问题的思路剖析

18030
来自专栏codingforever

经典算法巡礼(一) -- 排序之冒泡排序

事实上,她重复地遍历需要排序的元素,一次比较相邻的两个元素,如果不满足预先定义的比较条件,则交换;否则继续下一组元素比较,直至遍历完成需要排序的所有元素。当然,...

4220
来自专栏orientlu

读 《C Traps and Pitfalls》Record

单引号实际代表一个整数 双引号代表指向无名数组的起始字符的指针(字符结尾 0) 使用库函数计算得到的字符串长度不包括结尾的0!

12130
来自专栏pangguoming

java正则校验,密码必须由字母和数字组成

一个匹配数字和字母密码的正则表达式 2011 年 12 月 14 日 | Filed under: 正则表达式 and tagged with: 密码 , ...

66260
来自专栏前端布道

JavaScript之正则表达式

正则表达式 (regular expression) 描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某...

29460
来自专栏菩提树下的杨过

python中的zip、lambda、map操作

python 中有几个比较酷炫的操作,比如:zip、lambda、map 一、zip操作 zip字面意思:拉链。这么记,把几个东西扔到一个包里,拉上拉链,就算打...

32460
来自专栏marsggbo

c++学习笔记之继承篇

一 继承方式 public ? protected ? private ? 二 多继承和多重继承 举个例子就明白了 多继承 :农民工就算是多继承。 graph...

24250

扫码关注云+社区

领取腾讯云代金券