<b>《深度摸索C++对象模子》读书笔记(7)</b>[VC/C++编程]
本文“<b>《深度摸索C++对象模子》读书笔记(7)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
***Template的“具现”行为***
template class中的任何member都只能通过template class的某个实体来存取或操作.
Point<float>::Status s; // ok
Point::Status s; // error
假如我们定义一个指针,指向特定的实体,像这样:
Point<float> *ptr = 0;
由于这是一个指向class object的指针,本身并非一个class object,编译器不需求知道与该class有关的任何members数据.所以将“Point的一个float实体”具现也就没有必要.
假如不是一个pointer而是reference ,假定:
Point<float> &ref = 0;
这个定义的真正语领悟被扩 展为:
// 内部扩大
Point<float> temp(float(0));
Point<float> &ref = temp;
以上转化是因为reference并非无物(no object)的代名词,0被视作整数,必须被转换为范例Point<float>的一个对象.
但是, member functions只有在member functions被利用的时刻,C++ Standard才要求它们被“具现 ”出来.这个法则的由来主要有两个缘由:
(1)空间和效率的考虑.关于未利用的函数进 行“具现”将会耗费大量的时间和空间;
(2)还没有实现的功效.并非一个 template具现出来的全部范例一定可以完好支持一组member functions,因而只需具现真正需求的 member functions.
举个例子:
Point<float> *p = new Point<float>;
只有(a)Point template的float实例、(b)new 运算符、(c) default constructor需求被“具现”.
***Template的错误报告***
全部与类 型相关的查验,假如触及到template参数,都必须耽误到真正的具现操作发生.
关于下面的 template声明:
template <class T>
class Mumble
{
public:
Mumble(T t = 1024) : _t(t)
{
if(tt != t)
throw ex ex;
}
private:
T tt;
}
此中像“T t = 1024”、“tt != t”这样的潜在错误在template声明时并不会报告,而会在每个具现操作发生时被查抄出来并记录 之,后来果将因差别的实际范例而差别.
Mumble<int> mi; // 上述两个潜在错 误都不存在
Mumble<int*> pmi; // 由于不能将一个非零的整数常量指定给一个指针,故 “T t = 1024”错误
以上是“<b>《深度摸索C++对象模子》读书笔记(7)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |