《深度探索C++对象模型》读书笔记(7)

***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”错误

时间: 2024-10-27 14:58:38

《深度探索C++对象模型》读书笔记(7)的相关文章

深度探索C++对象模型(3)

介绍 多态是一种威力强大的设计机制,允许你继承一个抽象的public接口之后,封装相关的类型,需要付出的代价就是额外的间接性--不论是在内存的获得,或是在类的决断上,C++通过class的pointer和references来支持多态,这种程序风格就称为"面向对象". 大家好,雷神关于<深度探索C++对象模型>笔记终于又和大家见面了,速度慢的真是可以.好了不浪费时间了,直接进入主题. 这篇笔记主要解决了几个常常被人问到的问题. 1.C++支持多重继承吗? 2.结构和类的区别

《深度探索C++对象模型》读书笔记 最后一记

第6章主要讲述了执行期语意学,主要内容是关于数组的在构建和析构是如何进行的. 第7章主要讲述了有关Template的相关内容. 这两章内容散见于<Effective C++>.<More Effective C++>.<C++Primer><C++Templates中 文版>等书籍,如果感兴趣请阅读对应的书籍. 本读书笔记主要想谈一下对语意的理解. 本人认为C++程序设计可以简单分为三个层次:语法层.语言语意层(就像<深度探索C++对象模型>所讲

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书看了下, 感觉收获很大,因为书写得比较早,有些知识应该要更新,但是还是值得好好研读,由于该书的内容给人比较散的感觉,所以一直想找个时间整理一下,遂成此文,虽然都是抄书上的,但是却让我有了温故而知新的觉悟,附近里有三个好资料,一并共享了!2012年9月2日凌晨 4:31 谢谢 张雨生的歌声的相伴!   <

深度探索C++对象模型(7)

关于<深度探索C++对象模型>停顿了半个月,今天继续啃这个骨头,我的学习进入了第四章,函数的语意学.先做个复习C++支持三种成员函数:静态.虚.和非静态.每一种函数的调用方式都不同,当然他们的作用也会有区别,一般来说我们只要掌握根据我们的需要正确的使用这三种类型的成员函数便可以了,至于内部是如何运做的我们可以不知.但是<深度探索C++对象模型>正是让我们对这些不知道的东西进行深度探索的一本书.通过前面的学习,我想我知道了一些以前不知道的东西,但是感觉并没有提高多少,也许是我对此书的

深度探索C++对象模型(2)

史列因:我刚看了你写的"深度探索C++对象模型(1)",感觉很不错.不过我有一个建议:你说"谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生"是很自然的.第一章是一个总览,如果你能全看懂,后面的就没什么看的必要了.第一章的内容后面都有详细介绍,开始只要有个大概印象就可以了.这本书中很多内容都是前后重复的.我建议你先不管看懂看不懂,只管向后看,之后再从头看几遍,那样效果好得多. 我想史列因说的应该是一种非常好的阅读方式,类似<深度探索C++对象模型&g

深度探索C++对象模型(4)

雷神跌跌撞撞的读完了<深度探索C++对象模型>的第一章,虽然还是有些疑惑,但是已经感到收获很大.按照朋友的说法,第一章是一个概括的介绍,具体的细节会在以后的章节阐述,如果没有通读本书,第一章还是比较不容易理解的.雷神听过之后信心倍增,也不在有初看此书时的"世界末日"的感觉了(在第2篇雷神感到学了近一年的C++,居然水平如此之差),并且通过自己的努力,还是摸到了些门道,所以让我们继续快乐的出发,踏上深度探索C++对象模型的旅程.记住我们在第一篇的小文<坚持不懈,直到成功

c++-深度探索C++对象模型 虚函数表指针问题

问题描述 深度探索C++对象模型 虚函数表指针问题 <深度探索C++对象模型>中文版116页, "某些编译器设计了一种优化技术,只要第二个(或后继)base class声明了一个virtual function,而第一个base class没有,就把多个base classes的顺序调换.这样可以在derived class object中少产生一个vptr" vptr是如何减少的,想不明白,跪求解答 解决方案 没有虚函数的基类就不需要vptr了 解决方案二: 这个涉及虚表

《深度探索C++对象模型》读书笔记(1)

在C++中,有两种class data members:static和nonstatic,以及三种class member functions: static.nonstatic和virtual.已知下面这个class Point声明: class Point ...{ public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream&

《深度探索C++对象模型》读书笔记(6)

***对象的构造和解构*** 一般而言,我们会把object尽可能放置在使用它的那个程序区段附近,这样做可以节省不必要的对象 产生操作和销毁操作. ***全局对象*** 全局对象的静态初始化策略包括以下几个步骤: (1)为每一个需要静态初始化的对象产生一个_sti_--()函数,内含必要的 constructor调用操作或inline expansions: (2)为每一个需要静态的内存释放操作的对象产生一个_std_--()函数,内含必要 的destructor调用操作或inline expa