15.11重载解析与成员函数
重载函数解析的三个步骤
1.选择候选函数
2.选择可行函数
3.选择最佳匹配函数
15.11.1重载成员函数的声明
class myClass{ public: void f(double); void f(char,char); };
重载函数不能依据返回类型来判断,如
void f();
double f();
重载函数可以包括静态与非静态的成员,如
class myClass{ public: void mf(double); static void mf(int *); };
15.11.2候选函数
class myClass{ public: void mf(double); char mf(char,char='\n'); static void mf(int *); }; int main(){ myClass mc; int obj; mc.mf(obj); }
则候选函数包括myClass类中声明的三个mf成员函数
15.11.3可行函数
可行函数是函数的实参的类型和它的函数参数类型之间存在隐式
的类型转换。
在上例中,
mf(double)是可行性函数,可以把int类型的实参转换成类型
double
mf(char,char)也是可行性函数,可以把int型转换成char型
这两个转换具有一样的优先级,所以存在二义性。
class myClass{ public: static void mf(int); char mf(char); }; int main(){ char obj; myClass::mf(obj); }
在该调用中,mf(int)与mf(char)都是可行函数,但mf(char)是最
佳匹配,但是类成员函数不能通过类直接调用,程序出错。
如果是非静态成员具有const属性,如何调用呢?
public myClass{ public: static void mf(int*); void mf(double); void mf(int) const; }; int main(){ const myClass mc; double obj; mc.mf(obj); //实际调用mf(int) }
三个mf都是可行函数,mf(double)精确匹配,mf(int)可以通过
double转换成int型,但const对象只能调用const非静态成员函数
,所以mf(int)被调用
const对象可以调用静态成员吗?
class myClass{ public: static void mf(int); char mf(char); }; int main(){ const myClass mc; int obj; mc.mf(obj); }
静态成员函数只能访问该类的静态成员,所以类的实例访问静态
成员函数是有效的