《深度探索C++对象模型》读书笔记(7)
***Template的“具现”行为*** template class中的任何member都只能通过template class的某个实体来存取或操作。
如果我们定义一个指针,指向特定的实体,像这样:
由于这是一个指向class object的指针,本身并不是一个class object,编译器不需要知道与该class有关的任何members数据。所以将“Point的一个float实体”具现也就没有必要。 如果不是一个pointer而是reference ,假设:
这个定义的真正语意会被扩 展为:
以上转化是因为reference并不是无物(no object)的代名词,0被视作整数,必须被转换为类型Point<float>的一个对象。 然而, member functions只有在member functions被使用的时候,C++ Standard才要求它们被“具现 ”出来。这个规则的由来主要有两个原因: (1)空间和效率的考虑。对于未使用的函数进 行“具现”将会花费大量的时间和空间; (2)尚未实现的功能。并不是一个 template具现出来的所有类型一定能够完整支持一组member functions,因而只需具现真正需要的 member functions. 举个例子:
只有(a)Point template的float实例、(b)new 运算符、(c) default constructor需要被“具现”。 ***Template的错误报告*** 所有与类 型相关的检验,如果涉及到template参数,都必须延迟到真正的具现操作发生。 对于下面的 template声明:
其中像“T t = 1024”、“tt != t”这样的潜在错误在template声明时并不会报告,而会在每个具现操作发生时被检查出来并记录 之,其结果将因不同的实际类型而不同。
***Template中的名称决议方式*** 区分以下两种 意义:一种是“scope of the template definition”,也就是“定义出 template”的程序,另一种是“scope of the template instantiation”,也就是 “具现出template”的程序。
在“scope of the template definition”中,只有一个foo()函数声明位于scope之内;然而在“scope of the template instantiation”中,两个foo()函数声明都位于scope之内。对于以下函数操作:
那么 ,在invariant()中调用的究竟是哪一个foo()函数实体呢? Template之中,对于一个 nonmember name的决议结果是根据这个name的使用是否与“用以具现出该template的参数类型 ”有关而决定的,如果其使用互不相关,那么就以“scope of the template definition”来决定name,否则就以“scop |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |