- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用汇编的眼光看C++(之缺省模板、特化模板)
缺省函数是C++的一个基本特色。缺省函数定义比较简单,也就是说,对于函数的某一个输入参数或者几个输入参数,如果你没有特定的数值的话,那我们就会用缺省的数据进行代替。如果你在调用的过程中使用了自己的数据,那么缺省数据将被我们自己定义的数据覆盖。下面就是一个缺省函数的示例:
[cpp] view plaincopy
int add(int m, int n = 10)
{
return m + n;
}
如果调用呢,有什么区别?[cpp] view plaincopy
262: int p = add(2); push 0Ah
0040148A push 2
0040148C call @ILT+15(add) add esp,8 mov dword ptr [ebp-4],eax
263: p = add(3, 4); push 4 push 3
0040149B call @ILT+15(add)
004014A0 add esp,8
004014A3 mov dword ptr [ebp-4],eax
可以从上面的代码看到,如果单独输入一个数据2,那么编译器帮我们默认输入了10;如果输了的数据是3、4呢,那么编译器将用4代替默认的数据10。所以说,编译器帮我们做了中间的替换和判断工作。那么回到我们今天讨论的缺省模板类型上面,那会是什么样的情形呢?我们可以编写一个范例:[cpp] view plaincopy
template typename type1, typename type2 = int
class data
{
type2 value;
public:
data(type2 m): value(m) {}
~data() {}
};
可以看到,我们在第二个参数使用了缺省类型int,那么怎么证明缺省类型可以使用呢?我们设计了下面一个测试用例:[cpp] view plaincopy
239: dataint, int m(2);
004013BD push 2
004013BF lea ecx,[ebp-10h]
004013C2 call @ILT+5(dataint,int::dataint,int) (0040100a)
004013C7 mov dword ptr [ebp-4],0
240: dataint n(3);
004013CE push 3
004013D0 lea ecx,[ebp-14h]
004013D3 call @ILT+5(dataint,int::dataint,int) (0040100a)
上面的代码定义了两个临时变量,其中第一个是m,输入类型是int;第二个临时变量是n,输入类型是int和int。前面我们说过缺省类型是int,那么第一个临时变量m和第二个临时变量n的构造函数地址应该是一样的。那么事实上两者的构造函数是不是一样的呢?我们可以查看两者的函数地址,发现一个是0x0040100a,另外一个也是0x0040100a。范例证明我们的判断是正确的。 明白了上面的缺省模板构造,下面我们谈一下特化模板。特化模板是什么意思呢?其实并不复杂。因为模板类既然是通用模板,那么其中的数据类型可以是任意数据类型,但是难免有一些数据类型(比如说指针),我们需要对其中的一些操作做一些细微的修改,但是这些小的修改在原来的模板定义上是无法做的。那么怎么办?我们只好重新定义一种形式,它和模板类定义的名称一致,但是形式稍有差别。我们可以编写一个测试看看:
[cpp] view plaincopy
template typename type
class data
{
public:
data() {printf(normal!\n);}
~data() {printf(~normal!\n);}
};
template
您可能关注的文档
最近下载
- 3.1公民身份从何而来课件.pptx VIP
- 基于LabVIEW的音频信号数据采集和频谱分析.pdf VIP
- 2024年AMC8数学竞赛(英文)学生用卷及答案解析.pdf VIP
- GB/T 20895.1-2025小艇 稳性和浮性的评定与分类 第1部分:艇体长度不小于6 m的非帆艇.pdf
- 国家医保局-2024年医保支付方式改革培训班-DRG.DIP2.0版培训.docx VIP
- 反诈防诈 大学生防诈骗知识题库.docx VIP
- 《中西方饮食文化比较》课件.ppt VIP
- 九年级下册《出师表》过关训练-2024年中考语文课内文言文要点梳理与练习(全国通用)原卷版.docx VIP
- 什么是有限元教程.ppt VIP
- 商用密码应用安全性测评机构能力要求_《商用密码应用安.pdf VIP
文档评论(0)