当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++基础入门教程

C++再学习系列: C++编译器的工作流程

    C++ 中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍。

    对于  .cpp  文件中调用的一个函数  (  成员函数  ),  编译器主要做了下面三件事情  :

    1  名字查找  .  先在所在编译单元中可见名字实体 中进行名字查找  . (1)  类成员函数优先  (  对象所在的类  ->  基类  )。  一经找到就停止查找  . 如果没有  ,(2)  在相应的名字空间中做进一步的搜索  ;  如果还没有  ,  会根据  (3)  函数参数所在的名字空间中查找  (keoning  查找  )。

    2  重载决议  .  根据所找到的名字进行重载决议  ,  根据参数最匹配原则选择相应的函数  .

    3  可访问性检查  .  用以确定被选中的函数是否可以被调用  .

    说明  :

    1)  根据第一条  ,  显然  ,  如果类型想和非成员函数一起工作  ,  那么它们应该放在同一个名字空间中  .  比如  ,  一般类型的重载运算符和参数类型放在同一个头文件中  /  或者同一个名字空间下  .

    2)  函数特化模板不参与重载决议  ,  因此  ,  如果想运用某个函数的特化  ,  最好的方法是重载该函数  ,  在实现中采用该特化来工作  .

    3)  重载决议发生的可访问性检查之前  .  正因如此  ,  如果私有函数不幸参与了重载  ,  并且被选中的话  ,  最终也会出现无法访问的编译提示  .  这常常隐含二义性  ,  这样设计也不合理  .  换句话说  ,  私有参数  ,  在名字查找和重载时并非是  “  私有的  ”。

    以  c.Twice  (  21  )的函数调用为例:

    a)  名字查找:编译器会首先寻找一个至少包含一个名字为  Twice  的实体作用域(类,文件,或者名字空间),并将其中的候选实体列表。例子中,编译器首先从对象  c  所在的类实体中进行查找,找到就停止;如果没找到就会依次在其基类和外围的名字空间   中查找 ,直到找到一个至少含有一个候选函数的作用域。两点需要注意:  1)  只要找到一个实体就停止查找   ,所以并非所有的同名函数都会被考虑;  2)  参数所在名字空间也属于查找范围 (keoning  准则  )  .

    b)  重载决议:从所找到的候选重载函数列表中选出唯一最佳匹配   .如不唯一,就存在二义性。注意:  1)  这是基于名字查找结果的;  2)  特化的模板函数不参与重载。

    c)  可访问性检查:确定所选出的函数是否可访问。这是最后一步,晚于重载决议。

    后面将会有进一步的文章来介绍:如何确定 C++ 每个编译单元 (CPP 文件 ) 中的可见名字 ( 与名字查找相关 ) ; Keoning 查找详解;   重载  (Overload)  和虚函数的重实现  (override)。

相关内容
赞助商链接