《深度探索C++对象模型》读书笔记(4)
***非静态成员函数(Nonstatic Member Functions)*** C++的设计准则之一就是: nonstatic member function至少必须和一般的nonmember function有相同的效率。也就是说,如果我们 要在以下两个函数之间作选择:
那么选择member function不应该带来 什么额外负担。因为编译器内部已将“member函数实体”转化为对等的“nonmember函 数实体”。下面是magnitude()的一个nonmember定义:
现在,对该函数的每一个调 用操作也都必须转换:
对于class中的memeber,只需在member的名称中加上class名称,即可形成 独一无二的命名。但由于member function可以被重载化,所以需要更广泛的mangling手法,以提供绝对 独一无二的名称。其中一种做法就是将它们的参数链表中各参数的类型也编码进去。
上述的mangling手法可在链接时期检查出任何不正确的调用操作,但由于编码 时未考虑返回类型,故如果返回类型声明错误,就无法检查出来。 ***虚拟成员函数(Virtual Member Functions)*** 对于那些不支持多态的对象,经由一个class object调用一个virtual function,这种操作应该总是被编译器像对待一般的nonstatic member function一样地加以决议:
***静态 成员函数(Static Member Functions)*** 在引入static member functions之前,C++要求所有 的member functions都必须经由该class的object来调用。而实际上,如果没有任何一个nonstatic data members被直接存取,事实上就没有必要通过一个class object来调用一个member function.这样一来便 产生了一个矛盾:一方面,将static data member声明为nonpublic是一种好的习惯,但这也要求其必须 提供一个或多个member functions来存取该member;另一方面,虽然你可以不靠class object来存取一 个static member,但其存取函数却得绑定于class object之上。 static member functions正是 在这种情形下应运而生的。 编译器的开发者针对static member functions,分别从编译层面和 语言层面对其进行了支持: (1)编译层面:当class设计者希望支持“没有class object 存在”的情况时,可把0强制转型为一个class指针,因而提供出一个this指针实体:
(2)语言层 面:static member function的最大特点是没有this指针,如果取一个static member function的地址 ,获得的将是其在内存中的位置,其地址类型并不是一个“指向class member function的指针 ”,而是一个“nonmember函数指针”:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |