二义性就是有两个意义,两个意义都合理。这种问题在C++语言中会有发生,像函数重载时就有可能会发生二义性问题。写一段代码来让大家能清楚的理解函数重载二义性。
代码中,函数在调用时,出现了两个重载二义性。
第一个是因为参数类型编译器不知如何选择,
1 2 3 |
int Add(int a,int b); float Add(float a,float b); Add(i,f); //函数重载二义性 |
i是int类型,f是float类型,编译Add函数时编译器就没有办法作出选择调用哪个函数。修改方式就是在调用时显示做下类型转换。改成如下就没有二义性问题。
1 2 |
Add(i,(int)f); //调用int Add(int a,int b); Add((flost)i,f); //调用float Add(float a,float b); |
第二个是因为有了默认参数,编译器也不能确定具体调用哪个函数。
1 2 3 |
double Add(double a,double b) double Add(double a,double b,double c=0) Add(d,d); //函数重载二义性 |
d是double类型,编译Add函数时编译器就没有办法作出选择调用哪个函数。这类二义性就只能程序员在设计时不要制造出来。比如定义Add函数有重载时,就不要加默认参数,或是函数有默认参数就不要设计成重载。
以上只是举函数重载方面的二义性问题,还有别的特性也会有二义性产生,比如继承。对于二义性问题编译器是没有办法优化的了,这类问题只能在程序设计时就避免掉,不要有二义性产生。