请大家帮忙看一下函数重载的问题,谢谢

时间:2021-10-09 20:40:10
设int fp(char a,int b=0,double c=100.0);,判断下列重载函数的正确性。

(用T表正确,用F表错误)。

A、int fp( );(    )            B、void fp(char);(    )
C、int fp(char,int);(    )    D、void fp(char,int,int);(    )

重载函数不是说只要参数类型和参数个数不一致就对吗?那样的话是不是都正确吗?

45 个解决方案

#1


回答正确,都正确

#2


难道你在哪本书上说他们中间有不对的??
那你应该换本书了

#3


答案是A和D是对的,所以不明白为什么

#4


函数重载和函数参数的缺省值,应该二者取其一。

#5


我觉得A,B,D是正确的。int fp(char a,int b=0,double c=100.0);声明的时候不是给了默认参数吗?C区分不出来的。

#6


补充,B也是不对的。

#7


有什么问题?

#8


明白了,BC确实有问题
    B、void fp(char);(    ) 
C、int fp(char,int);(    ) 
例如
调用fp('a')这时系统不知道用的是int fp(char a,int b=0,double c=100.0)还是B
调用fp('a',0)时系统不知道是int fp(char a,int b=0,double c=100.0)还是C

#9


就是只有A和D正确:
函数int fp(char a,int b=0,double c=100.0);的后两个形参提供了默认值。当调用到B和C函数时就会去调用int fp(char a,int b=0,double c=100.0);,不够的参数就使用形参提供的默认值。而A和D的参数类型和参数个数不一致,所以。。。。

#10


我没考虑有int fp(char a,int b=0,double c=100.0)这个大前提,不好意思-_-

#11


B、C会产生二义性,因此是不正确的

#12


C肯定不对
B想不通………………

#13


函数重载,基本的是函数名,而参数不同,目的是可以调用目标函数.
所以A是对的,B是错误的,B的参数只有一个char,而int fp(char a,int b=0,double c=100.0)的另外两个参数是缺省的,这样就不知道调用哪个了,虽然B的返回类型不一样,但是返回类型不是函数重载所关心的,C的道理和B的基本一样,D是对的,因为D的最后一个参数是int型,符合重载的条件.

#14


试验了下B也是错误的
原来重载中void是当做任意类型

#15


楼上的完全正确!!

#16


引用 12 楼 hearoequal 的回复:
C肯定不对 
B想不通………………


B和C一样会产生二义性

#17


都是合法的重载。个人觉得你书上的答案是有问题。
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?

#18


引用 16 楼 anglecloudy 的回复:
引用 12 楼 hearoequal 的回复:
C肯定不对 
B想不通……………… 
 

B和C一样会产生二义性



我一直以为重载 的返回类型也属于重载的判断范围
刚才试试了下
int fp(int a)
double fp( int a)
都编译不过
原来自己这么基础的东西没搞清楚
惭愧啊

#19


引用 17 楼 steedhorse 的回复:
都是合法的重载。个人觉得你书上的答案是有问题。 
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。 
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?

不会吧,老大。
提供了默认值以后,就不能再提供一个仅仅少了这个提供默认值的参数的重载函数了。

这里的二义性不是指程序本身二义,而是说对编译器来说,产生二义了,编译器不知道怎么选择重载函数了。

#20


不调用,就不知道二义性,编译就可以通过。如果调用了,就肯定编译不过了,编译器不知道选哪个函数。
所以,比较迷惑的是,你那个问题中,对函数正确性的定义。

#21


只有A 是对的.   C 会产生二义性 

 B 和D 不属于重载 

#22


引用 21 楼 zhulinjia 的回复:
只有A 是对的.  C 会产生二义性 

B 和D 不属于重载 



不是吧B D不是重载是什么

重载(overload)的就是  在同一个作用域里面 定义了多个同名的方法

#23


A是正确的
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突,
 一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。
D不对,类似于B的错误。

#24


今天终于发现了一个问题.  原来我一直对函数的重载都理解错了. 

谢谢这发贴的人.    我搞懂了.

ABCD 都是对的.   

A 不管在什么情况下都不会产生二义性

B 如果你调用函数时只传一个参数就产生二义性

C 如果你调用函数时只传二个参数就产生二义性

D 如果你调用函数时只传二个参数就产生二义性

#25


LS
D没二义性吧
你只传2个参数 根本就调用不到D

#26


都是重载

#27


要说有问题也是设计上的问题

#28


引用 23 楼 jia_xiaoxin 的回复:
A是正确的 
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突, 
一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。 
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。 
D不对,类似于B的错误。

返回值不参与重载。。。。
不然:
int func(int i)
void func(int i)

如果调用:func(1),你说会调用那个函数?

#29


引用 19 楼 lann64 的回复:
引用 17 楼 steedhorse 的回复:
都是合法的重载。个人觉得你书上的答案是有问题。 
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。 
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题? 
 
不会吧,老大。 
提供了默认值以后,就不能再提供一个仅仅少了这个提供默认值的参数的重载函数了。 

这里的二义性不是指程序本身二义,而是说对编译器来说,产生二义了,编译器不知道怎么选择重载函数了。


你试过吗?我试过的,没有问题。

其实这也不用试。
编译器为什么要选择重载函数?当然前提是先要有重载函数可供选择,如果你连重载都不对,那他还怎么选择?
所以,先有重载,后有二义性;重载没有问题,不代表调用时也没有问题。但反过来调用时有问题,不代表重载是非法的。

#30


以下程序在我的机器上编译运行一点问题都没有:
#include <iostream>
using namespace std;

void f() {}
void f(int i = 0) {}

int main() {
f(1);
return 0;
}


换句话说,只要你别进行有二义性的调用,编译器才懒得帮你检查“潜在的二义性”。或者有某些高档的编译器可能帮你warning一下,但那并不是必需做的。

#31


wait

#32


函数重载的定义:C++允许定义多个相同名字的函数,只要这些函数的参数不同(至少参数类型或者参数数目或者参数类型的顺序不同)。
    所以A,B,C,D都是正确的重载函数。

#33


回答30的楼的问题:

  我在机子上测试了,你那样用的确没有问题,我觉的是那样用还没有让编译器感到二义性,若是改成这样编译器就会报错了,
#include <iostream>
using namespace std;

void f() {}
void f(int i = 0) {}

int main() {
    f();//f(1)
    return 0;
}

#34


引用 14 楼 hearoequal 的回复:
试验了下B也是错误的 
原来重载中void是当做任意类型

原来重载中void是当做任意类型  学习了 我也不知道!!“重载中void是当做任意类型”  但是我知道BC是不对的  重载函数的参数必须相等 其他的不知道

#35


LS我理解错了
函数返回值是不做为重载判断的
表学错了
呵呵

#36


A和D 吧

#37


引用楼主 study_study 的帖子:
设int fp(char a,int b=0,double c=100.0);,判断下列重载函数的正确性。 

(用T表正确,用F表错误)。 

A、int fp( );(    )            B、void fp(char);(    ) 
C、int fp(char,int);(    )    D、void fp(char,int,int);(    ) 

重载函数不是说只要参数类型和参数个数不一致就对吗?那样的话是不是都正确吗? 


A和D是对的

B中,假如给定了一个实参的函数调用,
如 fp('a');
函数B为精确匹配,
而原来的 函数    int fp(char a,int b=0,double c=100.0);
也是精确匹配,因为多出来的实参有缺省值,
两个函数都是精确匹配,导致二义性

C中的道理是一样的

#38


引用 32 楼 shiguang1975 的回复:
函数重载的定义:C++允许定义多个相同名字的函数,只要这些函数的参数不同(至少参数类型或者参数数目或者参数类型的顺序不同)。 
    所以A,B,C,D都是正确的重载函数。


从定义上来说,确实是这样的

但是在于重载函数的解析上来说不一定是对的
因为在解析时,确认调用哪一个重载函数做为最佳可行函数的时候,
实际给出的实参可以比调用的函数参数少,但是多出来参数必须有缺省值

#39


A和D是对的  B传入一个char,C传入一个char和int就无法和提供的函数区分了  
函数返回值是不能做重载标志的
还有如下的也不是重载
int fun(int n);
int fun(const int n);
int fun(int & n);

#40


函数重载具有三种匹配
精确匹配 提升匹配 标准匹配首先你需要从这个三个大方向去考虑
对于您上面的A和D我相信您一定您想得通了!很明显是精确匹配。
而对于B和C再没有默认参数的情况下相信您也乐意判定他也是正确的。但是有了默认的参数的时候,
例如您在程序中写下这样的程式void fp(‘c’);您可以精确的知道他匹配那一个函数吗,他既能与int fp(char a,int b=0,double c=100.0);精确匹配
同时也能和void fp(char);精确匹配,这无意就产生了程序的二义性。正如楼上所说的那样。

#41


引用 29 楼 steedhorse 的回复:
你试过吗?我试过的,没有问题。 

其实这也不用试。 
编译器为什么要选择重载函数?当然前提是先要有重载函数可供选择,如果你连重载都不对,那他还怎么选择? 
所以,先有重载,后有二义性;重载没有问题,不代表调用时也没有问题。但反过来调用时有问题,不代表重载是非法的。


你是正确的。是我对重载函数理解有错。谢谢答复。

楼主的问题17楼晨星老大已经给出标准答案了。o(∩_∩)o...

#42


学习了
收益非浅

#43


路过

#44


顶!

#45


谢谢大家的帮助

#1


回答正确,都正确

#2


难道你在哪本书上说他们中间有不对的??
那你应该换本书了

#3


答案是A和D是对的,所以不明白为什么

#4


函数重载和函数参数的缺省值,应该二者取其一。

#5


我觉得A,B,D是正确的。int fp(char a,int b=0,double c=100.0);声明的时候不是给了默认参数吗?C区分不出来的。

#6


补充,B也是不对的。

#7


有什么问题?

#8


明白了,BC确实有问题
    B、void fp(char);(    ) 
C、int fp(char,int);(    ) 
例如
调用fp('a')这时系统不知道用的是int fp(char a,int b=0,double c=100.0)还是B
调用fp('a',0)时系统不知道是int fp(char a,int b=0,double c=100.0)还是C

#9


就是只有A和D正确:
函数int fp(char a,int b=0,double c=100.0);的后两个形参提供了默认值。当调用到B和C函数时就会去调用int fp(char a,int b=0,double c=100.0);,不够的参数就使用形参提供的默认值。而A和D的参数类型和参数个数不一致,所以。。。。

#10


我没考虑有int fp(char a,int b=0,double c=100.0)这个大前提,不好意思-_-

#11


B、C会产生二义性,因此是不正确的

#12


C肯定不对
B想不通………………

#13


函数重载,基本的是函数名,而参数不同,目的是可以调用目标函数.
所以A是对的,B是错误的,B的参数只有一个char,而int fp(char a,int b=0,double c=100.0)的另外两个参数是缺省的,这样就不知道调用哪个了,虽然B的返回类型不一样,但是返回类型不是函数重载所关心的,C的道理和B的基本一样,D是对的,因为D的最后一个参数是int型,符合重载的条件.

#14


试验了下B也是错误的
原来重载中void是当做任意类型

#15


楼上的完全正确!!

#16


引用 12 楼 hearoequal 的回复:
C肯定不对 
B想不通………………


B和C一样会产生二义性

#17


都是合法的重载。个人觉得你书上的答案是有问题。
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?

#18


引用 16 楼 anglecloudy 的回复:
引用 12 楼 hearoequal 的回复:
C肯定不对 
B想不通……………… 
 

B和C一样会产生二义性



我一直以为重载 的返回类型也属于重载的判断范围
刚才试试了下
int fp(int a)
double fp( int a)
都编译不过
原来自己这么基础的东西没搞清楚
惭愧啊

#19


引用 17 楼 steedhorse 的回复:
都是合法的重载。个人觉得你书上的答案是有问题。 
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。 
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题?

不会吧,老大。
提供了默认值以后,就不能再提供一个仅仅少了这个提供默认值的参数的重载函数了。

这里的二义性不是指程序本身二义,而是说对编译器来说,产生二义了,编译器不知道怎么选择重载函数了。

#20


不调用,就不知道二义性,编译就可以通过。如果调用了,就肯定编译不过了,编译器不知道选哪个函数。
所以,比较迷惑的是,你那个问题中,对函数正确性的定义。

#21


只有A 是对的.   C 会产生二义性 

 B 和D 不属于重载 

#22


引用 21 楼 zhulinjia 的回复:
只有A 是对的.  C 会产生二义性 

B 和D 不属于重载 



不是吧B D不是重载是什么

重载(overload)的就是  在同一个作用域里面 定义了多个同名的方法

#23


A是正确的
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突,
 一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。
D不对,类似于B的错误。

#24


今天终于发现了一个问题.  原来我一直对函数的重载都理解错了. 

谢谢这发贴的人.    我搞懂了.

ABCD 都是对的.   

A 不管在什么情况下都不会产生二义性

B 如果你调用函数时只传一个参数就产生二义性

C 如果你调用函数时只传二个参数就产生二义性

D 如果你调用函数时只传二个参数就产生二义性

#25


LS
D没二义性吧
你只传2个参数 根本就调用不到D

#26


都是重载

#27


要说有问题也是设计上的问题

#28


引用 23 楼 jia_xiaoxin 的回复:
A是正确的 
B不对,因为返回类型不同,无法声明,会跟int fp(char a,int b=0,double c=100.0);冲突, 
一般会提示这样的错误:不能通过返会类型的不同来定义重载函数。 
C不对 因为如调用一个fp(a,b)的函数,会跟int fp(char a,int b=0,double c=100.0);产生二义性。 
D不对,类似于B的错误。

返回值不参与重载。。。。
不然:
int func(int i)
void func(int i)

如果调用:func(1),你说会调用那个函数?

#29


引用 19 楼 lann64 的回复:
引用 17 楼 steedhorse 的回复:
都是合法的重载。个人觉得你书上的答案是有问题。 
要注意:重载和二义性是两个概念。重载合法并不意味着不会产生二义性。是否产生二义性关键看如何调用,而不是看你如何重载。 
再说了,重载是前提,二义性是结果。如果重载不合法,那函数的声明都无法通过编译,哪里会有什么调用时产生二义性的问题? 
 
不会吧,老大。 
提供了默认值以后,就不能再提供一个仅仅少了这个提供默认值的参数的重载函数了。 

这里的二义性不是指程序本身二义,而是说对编译器来说,产生二义了,编译器不知道怎么选择重载函数了。


你试过吗?我试过的,没有问题。

其实这也不用试。
编译器为什么要选择重载函数?当然前提是先要有重载函数可供选择,如果你连重载都不对,那他还怎么选择?
所以,先有重载,后有二义性;重载没有问题,不代表调用时也没有问题。但反过来调用时有问题,不代表重载是非法的。

#30


以下程序在我的机器上编译运行一点问题都没有:
#include <iostream>
using namespace std;

void f() {}
void f(int i = 0) {}

int main() {
f(1);
return 0;
}


换句话说,只要你别进行有二义性的调用,编译器才懒得帮你检查“潜在的二义性”。或者有某些高档的编译器可能帮你warning一下,但那并不是必需做的。

#31


wait

#32


函数重载的定义:C++允许定义多个相同名字的函数,只要这些函数的参数不同(至少参数类型或者参数数目或者参数类型的顺序不同)。
    所以A,B,C,D都是正确的重载函数。

#33


回答30的楼的问题:

  我在机子上测试了,你那样用的确没有问题,我觉的是那样用还没有让编译器感到二义性,若是改成这样编译器就会报错了,
#include <iostream>
using namespace std;

void f() {}
void f(int i = 0) {}

int main() {
    f();//f(1)
    return 0;
}

#34


引用 14 楼 hearoequal 的回复:
试验了下B也是错误的 
原来重载中void是当做任意类型

原来重载中void是当做任意类型  学习了 我也不知道!!“重载中void是当做任意类型”  但是我知道BC是不对的  重载函数的参数必须相等 其他的不知道

#35


LS我理解错了
函数返回值是不做为重载判断的
表学错了
呵呵

#36


A和D 吧

#37


引用楼主 study_study 的帖子:
设int fp(char a,int b=0,double c=100.0);,判断下列重载函数的正确性。 

(用T表正确,用F表错误)。 

A、int fp( );(    )            B、void fp(char);(    ) 
C、int fp(char,int);(    )    D、void fp(char,int,int);(    ) 

重载函数不是说只要参数类型和参数个数不一致就对吗?那样的话是不是都正确吗? 


A和D是对的

B中,假如给定了一个实参的函数调用,
如 fp('a');
函数B为精确匹配,
而原来的 函数    int fp(char a,int b=0,double c=100.0);
也是精确匹配,因为多出来的实参有缺省值,
两个函数都是精确匹配,导致二义性

C中的道理是一样的

#38


引用 32 楼 shiguang1975 的回复:
函数重载的定义:C++允许定义多个相同名字的函数,只要这些函数的参数不同(至少参数类型或者参数数目或者参数类型的顺序不同)。 
    所以A,B,C,D都是正确的重载函数。


从定义上来说,确实是这样的

但是在于重载函数的解析上来说不一定是对的
因为在解析时,确认调用哪一个重载函数做为最佳可行函数的时候,
实际给出的实参可以比调用的函数参数少,但是多出来参数必须有缺省值

#39


A和D是对的  B传入一个char,C传入一个char和int就无法和提供的函数区分了  
函数返回值是不能做重载标志的
还有如下的也不是重载
int fun(int n);
int fun(const int n);
int fun(int & n);

#40


函数重载具有三种匹配
精确匹配 提升匹配 标准匹配首先你需要从这个三个大方向去考虑
对于您上面的A和D我相信您一定您想得通了!很明显是精确匹配。
而对于B和C再没有默认参数的情况下相信您也乐意判定他也是正确的。但是有了默认的参数的时候,
例如您在程序中写下这样的程式void fp(‘c’);您可以精确的知道他匹配那一个函数吗,他既能与int fp(char a,int b=0,double c=100.0);精确匹配
同时也能和void fp(char);精确匹配,这无意就产生了程序的二义性。正如楼上所说的那样。

#41


引用 29 楼 steedhorse 的回复:
你试过吗?我试过的,没有问题。 

其实这也不用试。 
编译器为什么要选择重载函数?当然前提是先要有重载函数可供选择,如果你连重载都不对,那他还怎么选择? 
所以,先有重载,后有二义性;重载没有问题,不代表调用时也没有问题。但反过来调用时有问题,不代表重载是非法的。


你是正确的。是我对重载函数理解有错。谢谢答复。

楼主的问题17楼晨星老大已经给出标准答案了。o(∩_∩)o...

#42


学习了
收益非浅

#43


路过

#44


顶!

#45


谢谢大家的帮助