函数重载问题

来源:百度知道 编辑:UC知道 时间:2024/05/17 21:01:59
已知系统中已定义函数fp,其原形是:
int fp(charc,int k=0,double d=100.0);
则下列函数中可以加以重载的是( )?(并非单选题)
a. int fp();
b.int fp(char,int,int);
请说明理由!

另一个问题:
假定已经定义了如下原形所示的函数:
int f(int k, int m=0,double d=0.0); //1
则f(3,5,6.7),f(3,5)和f(3)都是对这个函数的合法调用.在这种情况下就不能重载
int f(int); //2
int f(int,int); //3
int f(int,int,double);//4
int f(int,double=0.0);//5
等函数,因为对它们的调用无法与对//1所示函数的调用相区分.因此,前面所说的"必须在参数的数量上或类型上与其他同名函数有所不同"应该从调用的角度看,而不应从定义的角度看.在重载函数时,应该保证在逐个去掉可选参数后,仍然在参数个数或类型上与同名函数有所不同.

上面的int f(int,double=0.0);//5
它怎么也不能被调用?
在重载函数时,应该保证在逐个去掉可选参数后,仍然在参数个数或类型上与同名函数有所不同.
这句话,应该是从最后一个可选参数开始一个个地去掉吧? 可是,//5 是去掉的倒数第二个可选参数!所以,//5 在类型和数量上应该不相同吧?
请各位高手位指教! 重点请放在第二个问题! 请回答清晰!
上面的int f(int,double=0.0);//5
它怎么也不能被调用?
我的意思是,它它它它它不满足所谓的含有与题目中函数的参数类型和数量!
//1,//2,//3,//4,我都能看懂,但是,最后一个,它省略了第二参数,不符合可选参数的按最后一个开始去掉的规定啊! 不懂!

第一个问题很简单了,可以重载。
第二个问题:
你要明白:函数的重载就是通过两个条件来判断:要么函数参数个数不同,要么函数参数类型不同。那么,如下的5个函数都可以构成重载了:
int f(int k, int m=0,double d=0.0); //1
//int f(int); //2
//int f(int,int); //3
//int f(int,int,double);//4 假如说没这2.3.4这三个函数(考虑第二个问题)。
int f(int,double=0.0);//5

-------------------------已在VC6中测试验证过---
int f(int k, int m=0,double d=0.0); //1
int f(int,double=0.0);//5 只有这两个函数。
下面就是调用的问题了:
f(3,5,6.7)//可用。
f(3,5)//可以调用。只是此时是调用函数1。如果想调用函数5,就要用f(3,(double)5);就可以了。
f(3)//不可用,不明确的调用。

总结:调用的关键在于要看你传入的参数是否会引起“不明确调用”,如果会的话,就要强制一下传入的参数的类型。
回答完毕。

第一个问题:

两个都可以重载。函数的重载,指的是函数的名字相同而参数不同。
事实上,在编译系统编译的时候,是没有函数重载这个概念的。函数在编译的时候,会重新命名,命名规则一般是:原来的函数名@参数识别符
因此,从这个意义上讲,要么函数名不同,要么参数不同,二者取其一就可以避免重名的问题。

函数重载,实际上就是让参数识别符在编译的时候不同。从本质上来说,函数是不可以重名的。

由此你可以进一步自己思索一下问题二。

你问的是C#的题吧?
我最近也在学 不会抱歉
在知道里搜下 应该有类似的题