C++必知必会之(24)成员函数查找

来源:互联网 发布:tensorflow 图片分类 编辑:程序博客网 时间:2024/05/23 01:17

1、调用一个成员函数时,包括三个步骤:

第一步,编译器查找函数的名字;

第二步,从可用候选者中选择最佳匹配函数;

第三步,检查是否具有访问该匹配函数的权限。


2、很多与函数匹配有关的错误并非源于对编译器复杂的名字查找和重载函数匹配算法的误解,而是对这有序三大步的性质的误解。

class B  {

     public:

         //.....

         void f( double );

};

class D  :   public  B  {

      void f ( int );

};

//.....

D d;

d.f( 12.3 );         //混淆


上面调用的是哪一个成员f?


步骤1:查找函数的名字。因为正在调用一个D对象的成员,所以将从D的作用域开始查找并且立即定位到D::f上。

步骤2:从可用候选者中选择最佳匹配函数。我们只有一个候选者D::f,因此会尝试匹配该函数。可以通过将实参12.3从double转换为int而做到这一点。(但会丢失精度)

步骤3:检查访问权限。可能会产生一个错误,因为D::f是私有成员。


3、基类中的哪一个看上去有着更好的匹配、并且可访问的函数f已经无关紧要,因为一旦在内层作用域中找到另一个名字,编译器就不会到外层作用域中继续查找该名字。

内存作用域中的名字会隐藏外层作用域中相同的名字。


4、实际上,该名字甚至可以不是一个函数的名字:

class E  :   public  D   {

    int f;

};

//......

E e;

e.f( 12 );    //错误。

这样得到一个编译期错误,因为在作用域E中查找名字f,结果找到了一个数据成员,而不是成员函数。


这也是建立并遵从简单命名习惯的诸多理由之一。

如果数据成员E::f被命名为f_或m_f,它就不会隐藏被继承的基类函数f了。


原创粉丝点击