关于类成员函数重载的解析过程的非对称美
今天看了一上午成员函数重载解析过程,头都大了。至少在成员函数重载的解析过程上,我觉得没有一种对称美。不知道作者这么设计的原因是什么,请大家帮忙解释下。
代码是最好的例子!
1、
class SmallInt
{
public:
SmallInt(int iNumber=0):_iNumber(iNumber){}
static int Add(int a,int b){return a+b;}
float Add(float a,float b){return a+b;}
void PrintData()
{
cout<<"_iNumber:"<<_iNumber<<endl;
}
private:
int _iNumber;
};
int main()
{
float fVal=10.5;
SmallInt::Add(fVal,fVal); //出现错误
return 0;
}
上面的调用出现错误,原因是编译器在选择可行函数的时候把非静态和静态成员函数都选进去了。导致在第三阶段最佳匹配的时候匹配成float Add(float a,float b){return a+b;}。但是SmallInt::不能调用非静态成员函数。所以出错。
2、接下来在看const修饰符.
class SmallInt
{
public:
SmallInt(int iNumber=0):_iNumber(iNumber){}
static int Add(int a,int b){return a+b;}
float Add(float a,float b){return a+b;}
void PrintData()
{
cout<<"_iNumber:"<<_iNumber<<endl;
}
private:
int _iNumber;
};
int main()
{
float fVal=10.5;
const SmallInt si;
si.Add(fVal,fVal);//调用成功,调用的是static int Add(int a,int b){return a+b;}
return 0;
}
以上调用成功了,原因是编译器在第二阶段选择可行函数的时候,如果对象是const的,那么他只能调用const的成员函数(当然也包括静静态成员函数)而所有非const的成员函数都被排除了。所以可行函数其实只有一个static int Add(int a,int b){return a+b;},所以第三阶段的最佳匹配其实就是匹配这一个函数。
以上的疑惑:
对于SmallInt::调用来说,要到最佳匹配后才能决定这种调用格式对不对(有时候可能白选一场,因为即使你选出最佳匹配,但是调用格式不对,还是出错)。但是对于const对象来说,在第二阶段选择可行函数的时候就排除了非const成员。这样就不会存在上面提到的编译器做无用工。如果把静态函数的调用格式在第二阶段选择可行函数的时候就判断,不是更好吗?这样不是很对称吗?
请各位看客说说你们的看法