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);
}

静态成员函数只能访问该类的静态成员,所以类的实例访问静态
成员函数是有效的

 

 

 

 

 

 

 

 

 

 

posted on 2013-08-07 15:24  CQU  阅读(206)  评论(0编辑  收藏  举报

导航