[读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(上)
来源:互联网 发布:win7网络没有本地连接 编辑:程序博客网 时间:2024/06/05 10:06
整理最后一章的内容,关于模板,异常处理以及运行时类型信息的(RTTI: Run Time Type Information)。
这一节整理关于模板的内容。
1. 模板的具现(instantiation)行为。
当我们声明一个模板类时,对编译器而言,并不会发生什么,对于模板类中的枚举变量也是一样的,我们必须这样写:
Point<float>::Status s;//enum Status {Ongoing, Done}而不能这样写:
Point::Status s只有当定义一个类对象,不论是隐式的还是显式的,都会导致模板类的具现,例如:
Point<float> origin;此时模板类Point中,所有成员变量使用模板参数<typename type>的地方,都会被替换成float,此时该类的布局就像普通类一样,其大小也是可知的。
但是对于成员函数,可能只有被使用过的才会具现出来,这是因为:
a. 空间和时间的考虑,如果此类中存在大量的成员函数,而只有一小部分被使用过了,那么全部具现就显得浪费时间和空间了。
b. 尚未实现的机能,并不是一个模板具现出来的所有类型就一定能够完整的支持一组成员函数所需的运算符。
2. 模板的错误报告。
由于模板类在其具现之前,部分类型未知,所以涉及模板参数有关的类型检验,只有在模板具现之后才能进行,其结果将因具现类型的不同而不同。大多数编译器,面对一个模板的声明,在它被一组实际参数具现之前,只能施以有限的错误检查,所以编译得过得模板类其出错得概率远大于编译得过得普通类。
3. 模板中名称决议(resolution)方式。
考虑如下代码模板定义得范围代码:
//scope of template definitionextern double foo(double);template <typename type>class ScopeRules{public: void init() { _m = foo(_val); } type type_dependency() { return foo(_val); }private: int _val; type _m;};如下代码是模板具现得代码范围:
//scope of template instantiationextern int foo(int);ScopeRules<int> sr;在模板具现的代码范围内,有两个foo函数的声明,那么如下代码会调用哪一个:
sr.init();init()中的_m = foo(_val),调用哪一个foo,记住_val是int类型的,答案与我们期望的不一样,调用的是double foo(double),这是因为,有如下规则,对于一个非成员名字的决议结果,要看该名字是否与用以具现该模板的参数类型有关:
a. 如果不相关,就以scope of template definition来决定名字。
b. 如果相关,就以scope of template instantiation来决定。
上面例子中,foo()与用以具现ScopeRules的参数无关,所以只能调用scope of template definition中的foo,那么没有其他选择,只有double foo(double)。
再看以下例子:
sr.type_dependency();根据以上规则,会从scope of template instantiation来决议调用哪一个foo,而此时type是int类型,所以会调用int foo(int)版本。注意如果找不到匹配参数的foo,会报错误。
下片会继续整理异常处理相关的内容。
- [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(上)
- [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(中)
- [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(下)
- 深度探索C++对象模型读书笔记-第七章站在对象模型的尖端
- 《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端
- 深入探索C++对象模型 第七章 站在对象模型的尖端
- 深度探索C++对象模型第七章 站在对象模型的尖端
- 深度探索C++对象模型复习和学习 第七章:站在对象模型的尖端
- 【深度探索C++对象模型读书笔记】【第7章】站在对象模型的尖端
- 深入探索c++对象模型之站在对象模型的尖端
- 深入探索C++对象模型之七 --- 站在对象模型的尖端
- C++对象模型——站在对象模型的尖端 (第七章)
- 深度探索C++对象模型(七)站在对象模型的尖端
- 《深度探索C++对象模型》--7 站在对象模型的尖端
- [温故而知新] 《深度探索c++对象模型》——站在对象模型的尖端
- C++对象模型 ch7 站在对象模型的尖端
- 深入探讨C++对象模型 之 站在对象模型的尖端
- [读书笔记] 深入探索C++对象模型-第二章《构造函数语义学》(上)
- qemu-kvm虚拟机与宿主机之间简单文件传输方法
- idl之指针
- 在Android Studio中进行单元测试和UI测试
- 虚拟化之QEMU与KVM
- 萌新瞎讲网络流之最大流【不定期更新理解篇】
- [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(上)
- linux菜鸟入门之磁盘
- asp ajax post /get原生方法实现整数加法范例
- 020-无符号数条件转移指令JNB JAE JNC(大于等于)
- Mariadb配置文件优化参数(仅供参考)
- 数据结构 数组操作 稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。
- JQueryAJAX
- 总结EL表达式
- [POJ1717]Dominoes(dp)